JAVA/JAVA개발자 양성과정

[Servlet/JSP] POST파라미터 값 UTF-8인코딩 하는 필터, 회원의 IP/URL체크하는 필터

728x90
반응형

👩‍💻 자바 개발자 양성과정 28일차

  1. POST파라미터 값 UTF-8인코딩 하는 필터
  2. 회원의 IP/URL체크하는 필터

 

filter를 맵핑할때 방법은 두가지이다.

 

1. filter파일 상단에 적는 '에노테이션 방식'

@WebFilter("/AuthFilter")
@WebFilter(value="/*", initParams = {@WebInitParam(name="encoding", value="utf-8")})

 

2. web.xml에 적는 방식

<filter>
	<filter-name>Logging</filter-name>
	<filter-class>LoggingFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>Logging</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
	<filter-name>Encoding</filter-name>
	<filter-class>EncodingFilter</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</filter>

<filter-mapping>
	<filter-name>Encoding</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

두가지 방법 모두 작동은 동일하게 되지만,  차이점은 "web.xml에 적는 방식에 적는 방식은 작동순서를 조정할 수 있다."

만약, 순서에 상관없다면 에노테이션 방식을 사용해도 된다.

 

 

 

🛹 POST파라미터 값 UTF-8인코딩 하는 필터

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.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;

//@WebFilter(value="/*", initParams = {@WebInitParam(name="encoding", value="utf-8")})
// value="/*" ==> 모든 클라우드 요청에 대해서 인코딩 필터를 수행한다.

public class EncodingFilter implements Filter {
	private String encoding;
	
	/* FilterConfig 
	 * 필터가 초기화 되는 시점에 호출되는 init() 메서드의 매개변수로 전달되는 객체
	 * web.xml에서 <init-param> 태그를 통해 작성해둔 설정값 정보들과 ServletContext에 대한 참조를 가지고 있음
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		/* getInitParameter() 
		 * ServletConfig의 매서드
		 * 
		 * 미리 web.xml 에다가 지정해둔 파라미터들의 값을 얻어 올 수 있습니다.
		 */
		this.encoding = fConfig.getInitParameter("encoding"); //utf-8
	}

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

		/* getMethod()
		 * HttpServletRequest의 매서드
		 * 
		 * request.getMethod().equals("GET") 일 경우 GET 으로 넘어오는 경우엔 true를 반환
		 * request.getMethod().equals("POST") 일 경우 POST 로 넘어오는 경우엔 true를 반환
		 */

		/* qualsIgnoreCase()
		 * 
		 * equals는 대소문자 구분 
		 * equalsIgnoreCase는 대소문자 구분x
		 */
		
		//요청 request가 post인 경우 xml에 encoding이란 이름으로 저장해둔 파라미터 값(utf-8)으로 인코딩하자
		if (((HttpServletRequest) request).getMethod().equalsIgnoreCase("post")) {
			request.setCharacterEncoding(encoding); //원래 post를 받아올때 하던 인코딩 방식과 동일
		}

		/* doFilter()
		 * 
		 * 요청(Request)와 응답(Response)쌍이 체인을 통과할 때마다 컨테이너에서 호출됩니다.
		 */
		chain.doFilter(request, response);
	}

}

 

 

🛹 회원의 IP/URL체크하는 필터

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

//@WebFilter("/*")
public class LoggingFilter implements Filter {
	
	/* FilterConfig 
	 * 필터가 초기화 되는 시점에 호출되는 init() 메서드의 매개변수로 전달되는 객체
	 * web.xml에서 <init-param> 태그를 통해 작성해둔 설정값 정보들과 ServletContext에 대한 참조를 가지고 있음
	 */
	//doFilter안에서 servletcontext를 사용하기 위해서 변수를 만들어준다.
	private FilterConfig fConfig;
	
	public void init(FilterConfig fConfig) throws ServletException {
		//init호출시 FilterConfig데이터를 가지고 와서 변수에 넣어준다.
		this.fConfig = fConfig;
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		/* getRemoteAddr() 
		 * ServletRequest 내 메서드 
		 * 
		 * 클라이언트 ip address를 구한다.
		 */
		String ip = request.getRemoteAddr();
		String url = ((HttpServletRequest) request).getRequestURI();

		/* ServletContext 
		 * -> 어플리케이션 영역
		 * 
		 * 1.서블릿에서 파일 접근 가능 
		 * 2.자원 바인딩 기능 
		 * 3.로그 파일 기능 
		 * 4.컨텍스트에서 제공하는 설정 정보 제공 기능
		 */
		ServletContext context = fConfig.getServletContext();
		context.log("client ip" + ip); // 0:0:0:0:0:0:0:1
		context.log("client url" + url); // /servletWebApp/hello

		chain.doFilter(request, response);
	}

}
728x90
반응형