JSP 필터

별의개발자커비·2023년 5월 13일
0

JSP

목록 보기
13/31
post-thumbnail

필터

인코딩, 디코딩

필터 인터페이스 통해 구현하게 됨

init 필터 등..

1. 폼페이지에서 보낸 것을 필터하는 것 만들어보기

01. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>

	<security-role>
		<role-name>manager</role-name>
	</security-role>
	<security-constraint>
		<!-- 웹 자원에 대한 설정 -->
		<web-resource-collection>
			<!-- 자원 이름 -->
			<web-resource-name>BookStore2</web-resource-name>
			<!-- 접근 제한 url -->
			<url-pattern>/cart/security01.jsp</url-pattern>
			<url-pattern>/cart/security02.jsp</url-pattern>
            <!-- 2-1. security02-->
			<url-pattern>/shoppingmall/addProduct.jsp</url-pattern>
			<!-- 전송 방식 -->
			<http-method>GET</http-method> 
		</web-resource-collection>
		<!-- 인증된 사용자 -->
		<auth-constraint>
			<description>관리자</description>
			<role-name>manager</role-name>
		</auth-constraint>
		
<!--   		데이터 보호
		<user-data-constraint>
			NONE/INTEGRAL/CONFIDENTIAL: 기본값(데이처보호x) / 무결성(전송 중에 변경되지 않도록) / 기밀성
			<transport-guarantee>CONFIDENTIAL</transport-guarantee>
		</user-data-constraint>  -->
		
	</security-constraint>
	<login-config>
		<!-- <auth-method>BASIC</auth-method> -->
		<auth-method>FORM</auth-method>
		<form-login-config>
        	<!-- 4. shoppingmall/ login.jsp, loginfailed.jsp -->
			<form-login-page>/shoppingmall/login.jsp</form-login-page>
			<form-error-page>/shoppingmall/login_failed.jsp</form-error-page>
		</form-login-config>
	</login-config>
 	
 	<!-- 예외처리 페이지 -->
 	<!-- 우선순위 1)jsp 페이지에 설정한 애 > 2)exception-type > 3)error-code -->
 	<!-- 최우선순위: 코드 내의 것 -->
 	
 	<!-- 3순위. 코드에 의해 발생하는 애 error-code -->
 	<error-page>
	 	<error-code>404</error-code>
	 	<location>/shoppingmall/error_404.jsp</location>
 	</error-page>
 	 <error-page>
	 	<error-code>500</error-code>
	 	<location>/shoppingmall/error_500.jsp</location>
 	</error-page>
 		
 	<!-- 2순위. (유형별) 타입에 의해 발생하는 애 exception-type -->
 	<error-page>
 		<exception-type>java.lang.Exception</exception-type>
 		<location>/shoppingmall/exception_error.jsp</location>
 	</error-page>
 	
<!-- <context-param>
	<param-name>log4jConfigLocation</param-name>
	<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
	<listener-class></listener-class>
</listener> -->

<!-- 필터적용 시작 -->
	<filter>
		<filter-name>filter01</filter-name>
		<filter-class>filter.AuthenFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>filter01</filter-name>
		<url-pattern>/filter01_process.jsp</url-pattern>
	</filter-mapping>
<!-- 필터적용 끝 -->
 	
</web-app>

02. filter01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>filter01</title>
</head>
<body>
	<form action="filter01_process.jsp" method="post">
		<input type="text" name="name">
		<input type="submit" value="전송">
	</form>
</body>
</html>

03. AuthenFilter.java

package filter;

import java.io.IOException;
import java.io.PrintWriter;

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

public class AuthenFilter implements Filter {

	@Override
	public void destroy() {
		System.out.println("필터해제.....");
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("필터수행.....");
		String name =  request.getParameter("name");
		if(name== null || name.equals("")) {
			response.setCharacterEncoding("utf-8");
			response.setContentType("text/html; charset=utf-8");
			PrintWriter writer =  response.getWriter(); // rsp를 getwriter해준다는 게 뭘까?
			String message = "입력된 name은 null입니다.";
			writer.println(message);
			return;
		}
		chain.doFilter(request, response); // 연결시켜 주는 것
		
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("필터초기화.....");
	}
	
}
  • public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    변수 지정 잊지 말기!

- response.getWriter()?

https://charliecharlie.tistory.com/353

04. filter01_process.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>filter01_process</title>
</head>
<body>
	<% 
	request.setCharacterEncoding("utf-8");
	%>
	정상적으로 입력된 값은 <%= request.getParameter("name") %>
</body>
</html>

2. 필터로 값을 받아서 로그인해보기

01. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>

	<security-role>
		<role-name>manager</role-name>
	</security-role>
	<security-constraint>
		<!-- 웹 자원에 대한 설정 -->
		<web-resource-collection>
			<!-- 자원 이름 -->
			<web-resource-name>BookStore2</web-resource-name>
			<!-- 접근 제한 url -->
			<url-pattern>/cart/security01.jsp</url-pattern>
			<url-pattern>/cart/security02.jsp</url-pattern>
            <!-- 2-1. security02-->
			<url-pattern>/shoppingmall/addProduct.jsp</url-pattern>
			<!-- 전송 방식 -->
			<http-method>GET</http-method> 
		</web-resource-collection>
		<!-- 인증된 사용자 -->
		<auth-constraint>
			<description>관리자</description>
			<role-name>manager</role-name>
		</auth-constraint>
		
<!--   		데이터 보호
		<user-data-constraint>
			NONE/INTEGRAL/CONFIDENTIAL: 기본값(데이처보호x) / 무결성(전송 중에 변경되지 않도록) / 기밀성
			<transport-guarantee>CONFIDENTIAL</transport-guarantee>
		</user-data-constraint>  -->
		
	</security-constraint>
	<login-config>
		<!-- <auth-method>BASIC</auth-method> -->
		<auth-method>FORM</auth-method>
		<form-login-config>
        	<!-- 4. shoppingmall/ login.jsp, loginfailed.jsp -->
			<form-login-page>/shoppingmall/login.jsp</form-login-page>
			<form-error-page>/shoppingmall/login_failed.jsp</form-error-page>
		</form-login-config>
	</login-config>
 	
 	<!-- 예외처리 페이지 -->
 	<!-- 우선순위 1)jsp 페이지에 설정한 애 > 2)exception-type > 3)error-code -->
 	<!-- 최우선순위: 코드 내의 것 -->
 	
 	<!-- 3순위. 코드에 의해 발생하는 애 error-code -->
 	<error-page>
	 	<error-code>404</error-code>
	 	<location>/shoppingmall/error_404.jsp</location>
 	</error-page>
 	 <error-page>
	 	<error-code>500</error-code>
	 	<location>/shoppingmall/error_500.jsp</location>
 	</error-page>
 		
 	<!-- 2순위. (유형별) 타입에 의해 발생하는 애 exception-type -->
 	<error-page>
 		<exception-type>java.lang.Exception</exception-type>
 		<location>/shoppingmall/exception_error.jsp</location>
 	</error-page>
 	
<!-- <context-param>
	<param-name>log4jConfigLocation</param-name>
	<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
	<listener-class></listener-class>
</listener> -->

<!-- 필터적용 시작 -->
	<filter>
		<filter-name>filter01</filter-name>
		<filter-class>filter.AuthenFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>filter01</filter-name>
		<url-pattern>/filter01_process.jsp</url-pattern>
	</filter-mapping>
	
	<filter>
		<filter-name>filter02</filter-name>
		<filter-class>filter.InitParamFilter</filter-class>
		
		<init-param>
			<param-name>param1</param-name>
			<param-value>admin</param-value>
		</init-param>
		
		<init-param>
			<param-name>param2</param-name>
			<param-value>admin1234</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>filter02</filter-name>
		<url-pattern>/filter02_process.jsp</url-pattern>
	</filter-mapping>
<!-- 필터적용 끝 -->
 	
</web-app>

02. InitParamFilter.java

package filter;

import java.io.IOException;
import java.io.PrintWriter;

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

public class InitParamFilter implements Filter {
	private FilterConfig filterConfig = null ;
	

	@Override
	public void destroy() {
		System.out.println("필터2 해제............");
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("필터2 적용............");
		String id = request.getParameter("id");
		String psw = request.getParameter("psw");
		String param1 = filterConfig.getInitParameter("param1");
		String param2 = filterConfig.getInitParameter("param2");
		String message ;
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter writer =  response.getWriter(); // rsp를 getwriter해준다는 게 뭘까?
		
		if(id.equals(param1)|| psw.equals(param2)) {
			message = "로그인 성공";
			writer.print(message);
			chain.doFilter(request, response); // 필터끼리 연결해주는 것 a 필터 다음 b 필터 이렇게 겹겹히 수행하라고 
		} else {
			message = "로그인 실패";
			writer.print(message);
			chain.doFilter(request, response); // 필터끼리 연결해주는 것 a 필터 다음 b 필터 이렇게 겹겹히 수행하라고 
		}
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException { // filterConfig = web.xml에서 filter에 관련된 정보
		System.out.println("필터2 초기화............");
		this.filterConfig = filterConfig;
	}

}
  • private FilterConfig filterConfig = null ; ?
  • A filter configuration object used by a servlet container to pass information to a filter during initialization.
  • 각 함수의 매개변수 주의
  • filter config 선언 주의
  • 초기화에서 this.filterconfig 주의
  • https://dololak.tistory.com/606

03. filter02

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>filter02_process</title>
</head>
<body>
<% request.setCharacterEncoding("UTF-8"); 
String id =  request.getParameter("id");
String psw =  request.getParameter("psw");
%>
	<p> 당신이 입력한 아이디: <%= id %>, 비밀번호: <%=psw  %>
</body>
</html>

3. 한글 안깨지게 하는 필터

01. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>

	<security-role>
		<role-name>manager</role-name>
	</security-role>
	<security-constraint>
		<!-- 웹 자원에 대한 설정 -->
		<web-resource-collection>
			<!-- 자원 이름 -->
			<web-resource-name>BookStore2</web-resource-name>
			<!-- 접근 제한 url -->
			<url-pattern>/cart/security01.jsp</url-pattern>
			<url-pattern>/cart/security02.jsp</url-pattern>
            <!-- 2-1. security02-->
			<url-pattern>/shoppingmall/addProduct.jsp</url-pattern>
			<!-- 전송 방식 -->
			<http-method>GET</http-method> 
		</web-resource-collection>
		<!-- 인증된 사용자 -->
		<auth-constraint>
			<description>관리자</description>
			<role-name>manager</role-name>
		</auth-constraint>
		
<!--   		데이터 보호
		<user-data-constraint>
			NONE/INTEGRAL/CONFIDENTIAL: 기본값(데이처보호x) / 무결성(전송 중에 변경되지 않도록) / 기밀성
			<transport-guarantee>CONFIDENTIAL</transport-guarantee>
		</user-data-constraint>  -->
		
	</security-constraint>
	<login-config>
		<!-- <auth-method>BASIC</auth-method> -->
		<auth-method>FORM</auth-method>
		<form-login-config>
        	<!-- 4. shoppingmall/ login.jsp, loginfailed.jsp -->
			<form-login-page>/shoppingmall/login.jsp</form-login-page>
			<form-error-page>/shoppingmall/login_failed.jsp</form-error-page>
		</form-login-config>
	</login-config>
 	
 	<!-- 예외처리 페이지 -->
 	<!-- 우선순위 1)jsp 페이지에 설정한 애 > 2)exception-type > 3)error-code -->
 	<!-- 최우선순위: 코드 내의 것 -->
 	
 	<!-- 3순위. 코드에 의해 발생하는 애 error-code -->
 	<error-page>
	 	<error-code>404</error-code>
	 	<location>/shoppingmall/error_404.jsp</location>
 	</error-page>
 	 <error-page>
	 	<error-code>500</error-code>
	 	<location>/shoppingmall/error_500.jsp</location>
 	</error-page>
 		
 	<!-- 2순위. (유형별) 타입에 의해 발생하는 애 exception-type -->
 	<error-page>
 		<exception-type>java.lang.Exception</exception-type>
 		<location>/shoppingmall/exception_error.jsp</location>
 	</error-page>
 	
<!-- <context-param>
	<param-name>log4jConfigLocation</param-name>
	<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
<listener>
	<listener-class></listener-class>
</listener> -->

<!-- 필터적용 시작 -->
 	<filter>
		<filter-name>filter01</filter-name>
		<filter-class>filter.AuthenFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>filter01</filter-name>
		<url-pattern>/filter01_process.jsp</url-pattern>
	</filter-mapping>\
	
	<filter>
		<filter-name>filter02</filter-name>
		<filter-class>filter.InitParamFilter</filter-class>
		
		<init-param>
			<param-name>param1</param-name>
			<param-value>admin</param-value>
		</init-param>
		
		<init-param>
			<param-name>param2</param-name>
			<param-value>1234</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>filter02</filter-name>
		<url-pattern>/filter02_process.jsp</url-pattern>
	</filter-mapping>
	
	
	<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>filter.EncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		
	</filter>
	
	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
<!-- 필터적용 끝 -->
 	
</web-app>

02. EncodingFilter.java

package filter;

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;

public class EncodingFilter implements Filter {
	private String encoding;
	@Override
	public void destroy() {
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
        System.out.println("인코딩필터 적용.......");

//		HttpServletRequest hrequest = (HttpServletRequest) request ; 
//		HttpServletResponse hresponse = (HttpServletResponse) response ; 
//		hrequest.setCharacterEncoding(encoding);
//		hresponse.setCharacterEncoding(encoding);
		request.setCharacterEncoding(encoding);
		response.setCharacterEncoding(encoding);
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		encoding = filterConfig.getInitParameter("encoding");
		if(encoding == null) {
			encoding = "UTF-8";
			
		}
	}
	
}
  • request.setCharacterEncoding(encoding);
  • response.setCharacterEncoding(encoding);
  • chain.doFilter(request, response);
    정리@@
  • 왜 한글필터 안먹지?
profile
비전공자 독학러. 일단 쌔린다. 개발 공부👊

0개의 댓글