필터 : 자바 기본 지원
인터셉트 : 스프링 지원

프로그램을 만들어서 프로그램에 접속시킨다라는 의미?
weather Util에서 이러한 프로그램을 만들어서 심는다. 또는 1000번 접속하는 프로그램을 심는다.
-> 공격으로 간주되긴 함.
CSRF : a에서 b로 접속했으면 기록을 남기는 것.
session : 아이디 기록을 남기는 것.
현재
HTTP -> WAS -> servlet -> controlelr
시큐어
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
ADMIN





SERVICE
package com.kbstar;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.PatternMatchUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;
@Slf4j
public class LoginCheckFilter implements Filter {
private static final String[] whitelist = {"/","/checkid", "/register","/registerimpl", "/login","/loginimpl", "/logout","/css/*","/js/*","/webjars/*"};
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
HttpServletResponse httpResponse = (HttpServletResponse) response;
Enumeration<String> rstrings = httpRequest.getParameterNames();
while(rstrings.hasMoreElements()){
String name = rstrings.nextElement();
String result = httpRequest.getParameter(name);
log.info("-----------------------------------------------------------------"+result);
}
try {
if (isLoginCheckPath(requestURI)) {
HttpSession session = httpRequest.getSession(false);
if (session == null || session.getAttribute("logincust") == null) {
log.info("미인증 사용자 요청 {}", requestURI);
//로그인으로 redirect
httpResponse.sendRedirect("/login?redirectURL=" + requestURI);
return; //여기가 중요, 미인증 사용자는 다음으로 진행하지 않고 끝!
}
}
chain.doFilter(request, response); //다음 필터 진행. 없다면 서블릿 띄우기
} catch (Exception e) {
throw e; //예외 로깅 가능 하지만, 톰캣까지 예외를 보내주어야 함
} finally {
log.info("인증 체크 필터 종료 {}", requestURI);
}
}
/**
* 화이트 리스트의 경우 인증 체크X
*/
private boolean isLoginCheckPath(String requestURI) {
return !PatternMatchUtils.simpleMatch(whitelist, requestURI);
}
}

화면단에서 데이터를 검증할 때.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<script>
let item_add = {
maxSize: 5242880, // 5M
init:function(){
$('#register_btn').click(function(){
var formData = new FormData();
var inputFile = $("input[name='img']");
// console.log(inputFile);
var files = inputFile[0].files;
for(var i=0; i<files.length;i++){
// 함수 호출(checkExtension)
if(!item_add.checkExtension(files[i].name, files[i].size)){
return;
}
}
item_add.send();
});
},
checkExtension:function(fileName, fileSize){
var reg = new RegExp("(.*?)\.(exe|zip|alz)$");
// 파일크기 제한
// 실제파일의 크기 > 최대 크기
if(fileSize >= this.maxSize){
alert("파일 사이즈 초과");
return false;
}
// 확장자 제한
// 실제파일명의 확장자와 정규식 비교
// 정규식이면
if(reg.test(fileName)){
alert("해당 종류의 파일은 업로드 할 수 없습니다.");
return false;
}
return true;
},
send:function(){
$('#register_form').attr({
method:'post',
action:'/item/addimpl',
enctype: 'multipart/form-data'
});
$('#register_form').submit();
}
};
$(function(){
item_add.init();
});
</script>
<div class="container-fluid">
<!-- Page Heading -->
<h1 class="h3 mb-2 text-gray-800">Item Add</h1>
<!-- DataTales Example -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">Item Add</h6>
</div>
<div class="card-body">
<div id="container">
<form id="register_form" class="form-horizontal well">
<div class="form-group">
<label class="control-label col-sm-2" for="name">NAME:</label>
<div class="col-sm-10">
<input type="text" name="name" class="form-control" id="name" placeholder="Enter name">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="price">Price:</label>
<div class="col-sm-10">
<input type="number" name="price" class="form-control" id="price" placeholder="Enter price">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="img">Image:</label>
<div class="col-sm-10">
<input type="file" name="img" class="form-control" id="img" placeholder="Input image">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button id="register_btn" type="button" class="btn btn-info">Register</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
횟수제한
그림에 대한걸로 페이지가 맞는지 검증...