728x90
반응형
👩💻 자바 개발자 양성과정 28일차
- POST파라미터 값 UTF-8인코딩 하는 필터
- 회원의 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
반응형