본문 바로가기

프로그래밍/JSP

필터 - 로그인 검사 필터

필터

- HTTP 요청과 응답을 변경할  있는 재사용 가능한 코드

필터의 기본구조 

- 요청의 내용을 변경하거나 , 응답의 내용을 변경가능

- 1 이상의 필터 연동 가능 

필터예제

 LoginCheckFilter.java - 로그인필터클래스

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
//필터 예제
@WebFilter("/member/*")
public class LoginCheckFilter implements Filter {
    
    // 필터가 웹 컨테이너에서 삭제될 때 호출된다.
    public void destroy() {
        // TODO Auto-generated method stub
    }
    //체인을 따라 다음에 존자하는 필터로 이동.
    //체인의 가장 마지막 에는 클라이언트가 요청한 최종 자원이 위치
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        
         
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        // 1. request 파라미터를 이용하여 요청의 필터 작업 수행
        //getSession을 false로 지정하지않으면 session을 새로 생성 (기본값 = true)
        HttpSession session = httpRequest.getSession(false);
        
        boolean login = false;
        // 세션이 있는 경우 
        if (session != null) {
            if (session.getAttribute("MEMBER"!= null) {
                login = true;
            }
        }
        
        //세션이 있는경우  @WebFilter("/member/*")
        if (login) {
            chain.doFilter(request, response);
        } else {
            //세션이 없는 경우 loginForm 으로 포워딩
            RequestDispatcher dispatcher = request.getRequestDispatcher("/loginForm.jsp");
            dispatcher.forward(request, response);
        }
 
    }
    //필터를 초기화할 때 호출된다.
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
 
}
 
cs

LoginForm.jsp - 로그인 폼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>로그인 폼</title>
<style>
</style>
</head>
<body>
    <form action="<%=request.getContextPath()%>/login.jsp">
        아이디<input type="text" name="memberId"> 암호<input
            type="password" name="password"> <input type="submit"
            value="로그인">
    </form>
    <a href ="<%=request.getContextPath()%>/member/mypage.jsp">접속 없이 마이페이지</a>
</body>
</html>
cs


login.jsp - 입력한 id로 세션을 생성하는 action.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String memberId = request.getParameter("memberId");
    session.setAttribute("MEMBER", memberId);
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<style>
</style>
</head>
<body>
    
</body>
</html>
cs


mypage.jsp - 세션이 있는 경우에만 접근가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
</style>
</head>
<body>
<h1>세션 아이디 : ${MEMBER}</h1>
</body>
</html>
cs


세션이 있는 경우 : member/mypage.jsp로 포워딩.

세션이 없는 경우 : /login.jsp 로 포워딩.

→ 로그인 검사 필터클래스를 정의해 놓고 사용하면 세션을 사용하는 경우에 코드중복을 막을 수 있다.




'프로그래밍 > JSP' 카테고리의 다른 글

필터 - 캐릭터 인코딩  (0) 2018.07.21
파일 업로드  (0) 2018.07.20
MVC 패턴 구현  (0) 2018.07.19
JSP 환경구축2 (이클립스 설정)  (0) 2018.06.09
JSP 환경구축 1(이클립스+Tomcat설치 + 설정)  (0) 2018.06.09