코딩하는토끼 2021. 12. 2. 22:43

filter - 요청이 서블릿에 도달하기 전에 / 응답이 클라이언트에 도달하기 전에 - 거치며 사전작업을 하는 영역

 

filter01

F01Servlet

package filter01;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class F01Servlet
 */
@WebServlet("/filterex1/s01")
public class F01Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public F01Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("서블릿 1번 일함");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

doGet - "서블릿 1번 일함" 출력 (콘솔창)

 

F01Filter

package filter01;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class F01Filter
 */
@WebFilter("/filterex1/s01")
public class F01Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F01Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("필터1 통과함...");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 

패키지 우클릭 - new - filter 생성

@WebFilter() 안에 - filter 역할을 하려는 서블릿의 요청경로와 동일하게 작성

implements Filter 임

메소드 여러가지가 있는데, 그 중 doFilter 에 주목

doFilter 안에 "필터1 통과함..." 출력하는 코드 작성

 

실행하면, 필터1 통과함... 이후에 서블릿 1번 일함 출력됨

 

F02Servlet, F02Filter - 마찬가지로 위와같이 작성하는 연습

 

web.xml

	<filter>
		<filter-name>f03filter</filter-name>
		<filter-class>filter01.F03Filter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f03filter</filter-name>
		<url-pattern>/filterex1/s03</url-pattern>
	</filter-mapping>

와 같이 작성

/filterex1/s03 으로 요청이 오면, filter01.F03Filter 가 실행됨

필터 작성할 때마다 web.xml 에 작성하기! (annotation 에 작성하지 말고 되도록 여기에 작성하기)

 

F03Filter

package filter01;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class F03Filter
 */
// @WebFilter("/filterex1/s03")
public class F03Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F03Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("3번 필터 일함!!!");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

그냥 서블릿 없이 필터만 작성함 (서블릿이 있었으면 필터 이후에 서블릿도 일을 했을 것)

doFilter 에 "3번 필터 일함!!!" 출력하도록 작성

 

F04Filter

package filter01;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class F04Filter
 */
// @WebFilter("/F04Filter")
public class F04Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F04Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("4번 필터 일함");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

연습


filter02

여러개의 servlet 에 역할하는 필터

F05Filter

package filter02;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class F05Filter
 */
// @WebFilter("/F05Filter")
public class F05Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F05Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("5번 필터 일함");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

필터

요청경로를 web.xml 로 작성할거기 때문에 @WebFilter annotation 은 주석처리함

 

F05S01Servlet

package filter02;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class F05S01Servlet
 */
@WebServlet("/filterex2/s01")
public class F05S01Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public F05S01Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

첫번째 servlet

"/filterex2/s01" 경로로 작성

 

F05S02Servlet

package filter02;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class F05S02Servlet
 */
@WebServlet("/filterex2/s02")
public class F05S02Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public F05S02Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

두번째 servlet 

"/filterex2/s02" 경로로 작성

 

web.xml

	<filter>
		<filter-name>f05filter</filter-name>
		<filter-class>filter02.F05Filter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f05filter</filter-name>
		<url-pattern>/filterex2/s01</url-pattern>
		<url-pattern>/filterex2/s02</url-pattern>
	</filter-mapping>

서블릿 각 경로가 "/filterex2/s01", "/filterex2/s02" 인데

둘 중 어디에서 요청이 와도 필터가 작용하도록 하고싶다 - 위와같이 작성

 

F06Filter

package filter02;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class F06Filter
 */
// @WebFilter("/F06Filter")
public class F06Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F06Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("6번 필터 동작!!!!");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

@WebFilter 주석처리

doFilter 에 "6번 필터 동작!!!!" 출력하도록 작성

web.xml

	<filter>
		<filter-name>f06filter</filter-name>
		<filter-class>filter02.F06Filter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f06filter</filter-name>
		<url-pattern>/filterex2/*</url-pattern>
	</filter-mapping>

/filterex2/* 로 작성하면 /filterex2 로 시작하는 요청에 대해 작동함!

→ 위의 05 번에도 작동하게 됨 (여러개의 서블릿에 적용됨)

 

F07Filter

package filter02;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class F07Filter
 */
// @WebFilter("/F07Filter")
public class F07Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F07Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("7번 필터 일함!!!");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

@WebFilter 주석처리, doFilter 에 출력문 작성

web.xml

	<filter>
		<filter-name>f07filter</filter-name>
		<filter-class>filter02.F07Filter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f07filter</filter-name>
		<url-pattern>/filterex2/*</url-pattern>
	</filter-mapping>

만약, 이 코드가 05번 보다 위에 작성되어 있다면, 이 07번 필터가 먼저 작동 함

- 그냥 연습이었음-


filter03

F08Filter, F09Filter

/filterex3/ 으로 시작되는 경로로 요청이 왔을 때 작동하도록 두 필터를 작성하기

F08Filter

package filter03;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class F08Filter
 */
// @WebFilter("/F08Filter")
public class F08Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F08Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("8번 필터 일함");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

 

F09Filter

package filter03;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class F09Filter
 */
// @WebFilter("/F09Filter")
public class F09Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F09Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("9번 필터 일함");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

web.xml

	<filter>
		<filter-name>f08filter</filter-name>
		<filter-class>filter03.F08Filter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f08filter</filter-name>
		<url-pattern>/filterex3/*</url-pattern>
	</filter-mapping>

	<filter>
		<filter-name>f09filter</filter-name>
		<filter-class>filter03.F09Filter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f09filter</filter-name>
		<url-pattern>/filterex3/*</url-pattern>
	</filter-mapping>

 

그런데, 

만약 8번 필터의 doFilter 메소드 내의 

chain.doFilter(request, response);

이 코드를 주석처리 하면, 해당 경로의 요청이 왔을 때, 8번 필터만 작동하고 그 이후의 필터/서블릿(9번필터)는 작동하지 않음

(이 코드는 다음 필터/서블릿 과 연결해주는 코드이기 때문)

따라서, 어떤 조건에 의해 이 코드를 실행하거나 하지 않게 코드를 작성할 수 있음 (↓해보기)

 

F09S01Servlet

package filter03;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class F09S01Servlet
 */
@WebServlet("/filterex3/s01")
public class F09S01Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public F09S01Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("ex3 1번 서블릿 일함");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

@WebServlet("/filterex3/s01")

F09Filter

package filter03;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class F09Filter
 */
// @WebFilter("/F09Filter")
public class F09Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F09Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("9번 필터 일함");
		
		String user = request.getParameter("user");

		if (user != null && user.equals("notok")) {
			// param user가 notok이면 서블릿 실행하지 않음
		} else {
			chain.doFilter(request, response);
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

user 가 null 이 아니고 notok 이면 서블릿(위에 만든 서블릿)을 실행하지 않음

아니면 실행함

(user 는 쿼리 스트링으로 값을 줌)

 

forward 와 redirect 를 할 수도 있다! 해보자!

WEB-INF > view > filter03 폴더를 만들고, 09notok.jsp 파일 만들기

09notok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<link rel="stylesheet" href="<%=request.getContextPath()%>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">

<title>Insert title here</title>
</head>
<body>
  <!-- .container>.row>.col -->
  <div class="container">
    <div class="row">
      <div class="col">
        <!-- .alert.alert-danger -->
        <div class="alert alert-danger">
          무엇인가 잘못되었습니다.
        </div>
      </div>
    </div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>

그리고 다시 F09Filter

package filter03;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * Servlet Filter implementation class F09Filter
 */
// @WebFilter("/F09Filter")
public class F09Filter implements Filter {

    /**
     * Default constructor. 
     */
    public F09Filter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("9번 필터 일함");
		
		String user = request.getParameter("user");

		if (user != null && user.equals("notok")) {
			// param user가 notok이면 서블릿 실행하지 않음
			String path = "/WEB-INF/view/filter03/09notok.jsp";
			request.getRequestDispatcher(path).forward(request, response);
		} else {
			// pass the request along the filter chain
			chain.doFilter(request, response);
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

if - 다음 서블릿 실행하지 않고, 09notok.jsp 로 포워딩

else - 다음 서블릿 실행


filter04

F10MemberOnlyServlet

package filter04;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class F10MemberOnlyServlet
 */
@WebServlet("/filterex4/member")
public class F10MemberOnlyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public F10MemberOnlyServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/plain; charset=utf-8");
		response.getWriter().append("멤버입니다.");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

서블릿임

@WebServlet("/filterex4/member") 로 경로작성

doGet 에 response.getWriter().append("멤버입니다."); 작성

 

F10LoginServlet

package filter04;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class F10LoginServlet
 */
@WebServlet("/filterex4/login")
public class F10LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public F10LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String path = "/WEB-INF/view/filter04/login.jsp";
		request.getRequestDispatcher(path).forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		String pw = request.getParameter("password");
		
		String location = "";
		if (id.equals(pw)) {
			// 로그인 성공
			HttpSession session = request.getSession();
			session.setAttribute("logedIn", "ok");
			
			location = request.getContextPath() + "/filterex4/member";
		} else {
			location = request.getContextPath() + "/filterex4/login";
		}
		response.sendRedirect(location);
	
	}

}

서블릿임

@WebServlet("/filterex4/login")

doGet 에서 login.jsp 로 포워딩

doPost 에서 로그인 성공하면 member 서블릿(바로 위 서블릿)으로 리디렉트

실패하면 login 서블릿(지금 이 서블릿)으로 리디렉트

 

login.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<link rel="stylesheet" href="<%= request.getContextPath() %>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">

<title>Insert title here</title>
</head>
<body>
<form action="" method="post">
  <input type="text" name="id"> <br>
  <input type="password" name="password"> <br>
  <input type="submit" value="로그인">
</form>

<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>

그냥 로그인 form (post 방식으로 전달)

 

F10MemberFilter

package filter04;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet Filter implementation class F10MemberFilter
 */
// @WebFilter("/F10MemberFilter")
public class F10MemberFilter implements Filter {

    /**
     * Default constructor. 
     */
    public F10MemberFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		
		// TODO Auto-generated method stub
		// place your code here
		HttpSession session = req.getSession();
		
		String logedIn = (String) session.getAttribute("logedIn");

		// pass the request along the filter chain
		if (logedIn != null && logedIn.equals("ok")) {
			chain.doFilter(request, response);
		} else {
			String location = req.getContextPath() + "/filterex4/login";
			res.sendRedirect(location);
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

필터임

doFilter 에서

if logedIn 이 null 이 아니고 ok 이면 다음 서블릿 실행

if else 아니면 login 서블릿으로 리디렉트

 

web.xml

	<filter>
		<filter-name>f10filter</filter-name>
		<filter-class>filter04.F10MemberFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>f10filter</filter-name>
		<url-pattern>/filterex4/member</url-pattern>
	</filter-mapping>

 

 

F10MemberFilter 추가설명

		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

 

filter 에서 request, response 는 ServletRequest 타입이어서 

HttpServletRequest 타입에서 쓰이는 getSession, getAttribute, getContextPath, sendRedirect 사용불가

(ServletRequest → HttpServletRequest 상속관계)

따라서 HttpServletRequest 로 형변환


servlet08

S01BookCharEncodingFilter

 

web.xml

	<filter>
		<filter-name>BookCharEncodingFilter</filter-name>
		<filter-class>servlet08.S01BookCharEncodingFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>BookCharEncodingFilter</filter-name>
		<url-pattern>/servlet08/*</url-pattern>
	</filter-mapping>