Day59 - [JSP]필터

2021. 5. 10. 22:35JSP 공부

이번에는 JSP 환경에서의 필터에 대해서 알아 봅시다.

 

필터

평소에 필터라는 말을 들어보신 적이 있을 겁니다.

필터는 원하는 것만 걸러내서 보여주죠?

 

여기서도 똑같습니다. 필터는 FrontController(서블릿) 으로 들어가기전 요청을 가로채 검사하는 역할을 가지고 있습니다

 

그러면, 필터를 한번 만들어 보도록 합시다.

 

필터 생성

1. 필터 클래스는 일반 자바 파일로 생성합니다.

2. Filter 인터페이스를 상속 받습니다

3. 일반적으로 doFilter메서드를 오버라이딩 합니다

4. 사용 후 doFilter(request, response); 메서드를 반드시 사용 합니다.

 

public class AuthFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
 
 //컨트롤러(서블릿) 으로 들어가기 전에!!!!!!
  //가로채 처리할 작업을 선언한다!!!!!!!
  //사용을 마치면 반드시 사용
  chain.doFilter(request, response);
  
}

필터의 사용방법

1. 어노테이션 방법

//@WebFilter("*.board") //.board로 끝나는 모든요청
@WebFilter({"/board/writer.board", "/board/modify.board", "/board/update.board", "/board/delete.board" }) //특정 요청
public class AuthFilter implements Filter {

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      chain.doFilter(request, response)
  }

}

 

2. web.xml 방법

web.xml 에 사용하는 방법은, 필터 -> 필터 -> 컨트롤러 의 순서가 필요할 때 사용합니다.

거의 사용할 일이 없다고 합니다.

 

첫번째 필터 -> FirstFilter

두번째 필터 -> SecondFilter

<!-- 만약 FirstFilter, SecondFilter를 순서대로 동작시키려면 web.xml에 선언합니다. -->
  
  <!-- 필터 등록 -->
  <filter>
  	<filter-name>first</filter-name>
  	<filter-class>com.myweb.util.filter.FirstFilter</filter-class>
  </filter>
  <filter>
  	<filter-name>second</filter-name>
  	<filter-class>com.myweb.util.filter.SecondFilter</filter-class>
  </filter>
  
  <!-- 필터 url등록 -->
  <filter-mapping>
  	<filter-name>first</filter-name>
  	<url-pattern>/board/list.board</url-pattern>
  </filter-mapping>
  <filter-mapping>
  	<filter-name>second</filter-name>
  	<url-pattern>/board/list.board</url-pattern>
  </filter-mapping>

 

필터 사용 예제

필터를 사용해서, 로그인을 한 사용자만 게시판의 글을 작성할 수 있도록 해줍시다.

@WebFilter({"/board/write.board", "/board/regist.board"}) // 글쓰기 화면이나, 글 등록시에만 실행
public class BoardFilter implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		request.setCharacterEncoding("UTF-8");
		
		// 필터를 이용해서 인가된 사용자만 글 등록을 하도록 처리.
		// ServletRequest는 HttpServletRequest의 부모타입.
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
		HttpSession session = req.getSession();
		
		String user_id = (String)session.getAttribute("user_id");
		
		if(user_id == null) {
//			res.sendRedirect("list.board");
			// Out객체를 이용해서, 브라우저 측으로 스크립트형식을 만들어서 전달..
			
			res.setContentType("text/html"); // 문서의 형식지정
			res.setCharacterEncoding("UTF-8");
			
			PrintWriter out = res.getWriter(); // 출력의 방향-> 브라우저
			out.println("<script>");
			out.println("alert('권한이 없습니다')");
			out.println("location.href='/MyWeb/board/list.board'");
			out.println("</script>");
			
			return; // 필터함수의 종료(컨트롤러 실행x)
		}
		
		chain.doFilter(request, response); // 서블릿이나 or 연결되어 있는 다른 필터를 실행시킴
	}
}

기본적으로 doFilter에 매개변수로 되어있는 request, response 는 몇몇개의 메서드가 빠져 있습니다.

( ServletRequest는 HttpServletRequest 의 상위 클래스 or 인터페이스 라서 그렇습니다. )

 

게시판의 글을 수정하고 삭제할 수 있는 권한은 작성자와 로그인한 사용자가 같을 때 입니다.

// 수정, 삭제에 대한 필터 (작성자와 세션값이 동일할 때만 실행되도록 처리)
@WebFilter({"/board/modify.board", "/board/update.board", "/board/delete.board"})
public class BoardFilter2 implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		request.setCharacterEncoding("UTF-8");
		
		/*
		 * 1. 등록화면에서 작성자를 id or 닉네임값으로 고정
		 * 2. 각 요청에서 id가 parameter로 전달되는지 확인
		 * 3. modify, update, delete요청에서 writer를 파라미터값으로 전달. 비교..
		 * 4. 화면에서 버튼을 안보이도록 처리
		 */
		
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
		// 화면에서 전달되는 writer
		String writer = req.getParameter("writer");
		
		// 로그인된 사용자 세션에 user_id
		HttpSession session = req.getSession();
		String user_id = (String)session.getAttribute("user_id");
		
		if(user_id == null) { // 로그인이 안된경우
			res.sendRedirect("/MyWeb/user/login.jsp");
			return;
		} else if(writer == null || !user_id.equals(writer)) { // 잘못접근한 경우 or 로그인한 사용자가 일치하지 않는 경우

			res.setContentType("text/html");
			res.setCharacterEncoding("UTF-8");
			
			PrintWriter out = res.getWriter();
			out.println("<script>");
			out.println("alert('권한이 없습니다')");
			out.println("location.href='/MyWeb/board/list.board'");
			out.println("</script>");
			
			return;
		} 
		
		chain.doFilter(request, response);
	}
	
}

위의 파라미터에서 사용자를 비교해주기 위해서, 넘어올 때 writer 파라미터가 넘어올 수 있도록 처리 합니다.

 

이렇게, 필터에 대해서 알아 보았습니다.

 

고생하셨습니다.

'JSP 공부' 카테고리의 다른 글

Day59 - [JSP]페이징  (1) 2021.05.10
Day 58 -[JSP]MVC2 게시판 만들기  (0) 2021.05.09
Day57 - [JSP]URL패턴 , MVC2 전체적인 컴포넌트 설계  (0) 2021.05.06
Day56 - [JSP]연결풀(Connection pool)  (0) 2021.05.05
Day56 - [JSP]JSTL  (0) 2021.05.05