day 43 [필터 filter 클래스] 중요 ★

stan·2023년 7월 5일
0

jsp

목록 보기
13/15

[ 필터(.java 클래스) ] 매우 매우 중요 (스노우 필터 생각하면됨)
- 이거 없으면 아무것도 안돌아감
- 솔루션 프레임워크 이런데서는 기본적으로 탑재되어 있는 기능 (spring도 기본으로 들어가 있음)
- 그래서 보통 모르고 씀 (필터클래스를 개발하는 경우는 잘 없음)


test03

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>필터 클래스 01</title>
</head>
<body>

<form action="test04.jsp" method="post">
	보낼 데이터: <input type ="text" name="data">
	<input type = "submit" value = "데이터 전송">
</form>

</body>
</html>

test04

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>필터 클래스 02</title>
</head>
<body>

도착한 데이터: ${ param.data } <!-- param붙어야 attribute --> 


</body>
</html>
  • test03 에서 test04 넘어갈때 한글깨짐 방지 인코딩 필요함

  • 1) 왜 쓰냐?
    사용자(브라우저의,클라이언트의)의 요청에 특정기능을 부여하기 위해 사용
    ex) 인코딩, 권한 확인, 로그, 보안, ... (새싹회원 이상이니?) (몇시몇분 누가 이거 작성) (언제 돈 인출함)

스프링에서 사용하는 인코딩 필터

  • 2) 필터 클래스는 언제 동작됩니까?
    V ---> 필터클래스 거쳐서(기능부여)---> C로 옴(이 타이밍에 동작)
    사용자(브라우저의,클라이언트의)의 요청 직후에 호출 됩니다!
    정확히는 Filter mappings 설정한 시간에 호출됩니다!
    보통 filter mapping을 이때 합니다
          

Java폴더 안에 -> test패키지-> filter 생성

*.jsp 별도 붙여야함


annotation 자바 문법이고 코드에 대한 설명을 나타냄

인코딩을 넣으면 한글 깨짐 해결 되지만 메서드는 속도를 느리게 함
- 필터 클래스화 할거임

대표적인 Not POJO (plain old java object)

POJO : 
우리가 만들면 보통 POJO입니다. 
ex) StudentVO, Car, Point, ...
	일반 class 파일로 만들수있는 자바 클래스 객체 
	아무 기능이 없는 밍숭맹숭한

Not POJO :
e.g. 서블릿, 필터, 리스너

  • class 파일을 생성할때부터 이미 import가 많이 되어있는 상태
    기본 기능들이 이미 많이 있음 (실무에서 쳐 알아들으라고)

Not POJO

이미 기능이 많이 있다

    public EncFilter() { //기본 생성자 필수
        super();
        // TODO Auto-generated constructor stub
    }
  • 기본생성자가 디폴트

EncFilter

package test;

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;
import javax.servlet.http.HttpFilter;

/**
 * Servlet Filter implementation class EncFilter
 */
//@를 어노테이션 annotation이라고 부름
@WebFilter("*.jsp")
public class EncFilter extends HttpFilter implements Filter {
       
	private String encoding; //멤버변수 초기화 해야됨
	
    /**
     * @see HttpFilter#HttpFilter()
     */
    public EncFilter() { //기본 생성자 필수
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// 필터가 메모리에서 해제될때 자동 호출
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 인코딩 처리 로직 (보통 chain.doFilter위에 넣음)
		//request.setCharacterEncoding("UTF-8");//"UTF-8"이 하드코딩 되어있음 : 유지보수 불리함
		// --->> 상수화 
		request.setCharacterEncoding(this.encoding);
		// --->> 설정파일을 생성해서 해당 파일의 내용을 로드(불러와서) 사용 WEB-INF하위에 XML파일 
		//			: JAVA를 재작성하게되면 컴파일을 다시 해야 됩니다.
		//			: 라는건 서버거 최소 1초이상 정지 되어야 한다는거임 == 사용자가 그 시간동안 이용을 못한다
		// 			: -->> 영업손실
		
		System.out.println("로그ㅠㅠㅠ");
		
		chain.doFilter(request, response); //== 이녀석이 바로 사용자의 요청
		//여기 안에 사용자의 요청 정보들이 모두 저장되어있음
		// 사용자의 요청정보를 보고, 무엇을 요청했는지를 찾아서 다음 페이지로 이동하기 때문에,
		//이동하기 전에 인코딩 처리 해야함
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// 필터가 최초로 생성될때 자동 호출
		// '최초로 생성될때' 호출되기 때문에 단 1번 호출됨
		//this.encoding="UTF-8"; //멤버변수 초기화
		//멤버변수 초기화는 생성자의 역할인데 왜 init에서 합니까?
			// Not POJO의 초기화는 init에서 합니다
			// 생성자들이 이미 하는게 너무 많아; 일반적으로 Not POJO들은 생성자를 건들지 않음
			//그래도 그래야하는 이링 있기 때문에 init이 있는거임
		//↑이것도 하드코딩 아닌가요??
		
		this.encoding=fConfig.getServletContext().getInitParameter("encoding");
		System.out.println("로그 init 동작");
	}	

}
  • encoding 상수화 (유지보수)

WEB-INF폴더 안에 web.xml 만들어야 함

- 톰캣 내장 서버는 web-inf 하위에 web.xml을 보라고 이미 되어 있음

  • web-app으로 시작하는 스키마 태그 사용

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

	 <context-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
   </context-param>

</web-app>
profile
이진 입니다

0개의 댓글