티스토리 뷰

spring

Filter 작동 순서

tonirr 2020. 2. 9. 22:58
public class LoginFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		Filter.super.destroy();
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
       
		CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response);
        ResponseWrapper rw = new ResponseWrapper(response);
        DecryptRequestWrapper rWrapper = new DecryptRequestWrapper((HttpServletRequest) request);

        // /login을 제외한 GET 요청에 대해 적용
        if(rWrapper.getMethod().equals("GET") && !rWrapper.getServletPath().equals("/login")){
        	chain.doFilter(rWrapper, response);

        }
        
        // /login GET 요청에 대해 적용
        if(rWrapper.getMethod().equals("GET") && rWrapper.getServletPath().equals("/login")){
        	chain.doFilter(rWrapper, wrapper);
        	rw.charWrite(response, wrapper);

        }
        
        // POST 요청에 대해 적용
        if(rWrapper.getMethod().equals("POST")){
        	
            // username, password 의 값을 받아옴
	        String e_id = request.getParameter("username");
	        String e_pwd = request.getParameter("password");
	        
	        Decoder decoder = Base64.getDecoder();
	        
	        // Decoder#decode(bytes[] src) 
	        byte[] decodedBytesId = decoder.decode(e_id);
	        byte[] decodedBytesPwd = decoder.decode(e_pwd);
	
			// 디코딩한 문자열을 표시
			String d_id = new String(decodedBytesId);
			String d_pwd = new String(decodedBytesPwd);
	        
            // request 래퍼클래스에 디코딩된 문자열을 전달
	        rWrapper.setDecryptParameter(request.getParameterMap(), d_id, d_pwd);
	        
            // 디코딩된 문자열을 통해 dofilter 메소드 작동
	        chain.doFilter(rWrapper, wrapper);
	        
        }
        
	}

}

 

/login get요청

-> method 가 get이고 /login인 요청에 대해 작동

-> dofilter 작동하여 다음필터로 값을 넘김(항상 user필터가 작동되는지..?)

-> response로 받은 html을 인코딩 코드로 변조

 

username, password 입력

-> /login post요청

-> 입력된 값은 변조된 html에 의하여 인코딩

-> request.getParameter 에서 인코딩 된 값 디코딩

-> request wrapper 에서 디코딩 된 값 맵에 싣기

-> request wrapper 에서 맵에 있는 값을 getParameter 메소드에서 값 바꾸기

-> dofilter 에서 바뀌어진 값을 가지고 request 해줌

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함