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>
'course 2021 > JDBC\DB' 카테고리의 다른 글
DB01 - 19일(sql01~05, jdbc01~02) (0) | 2021.12.04 |
---|---|
listener (0) | 2021.12.04 |
DB - aws, sql (0) | 2021.12.02 |
servlet03 - 07, 08, 09 (0) | 2021.12.02 |
servlet02 - 03, 04, 05, 06 (0) | 2021.12.01 |