Filter
필터 객체 생성은 서블릿과 다르게 웹애플리케이션이 시작할 때 생성된다.
init()
: 필터 객체 생성 후 즉시 호출된다(필터가 작업하는데 필요한 자원을 준비 시키는 코드를 둔다)
doFilter()
: 요청이 들어올때 호출 된다.
destory()
: 웹애플리케이션이 멈출때 호출된다.(init()에서 준비한 자원을 해제시키는 코드를 둔다)
필터 배치
1) 애노테이션
@WebFilter(url)
자기가 만든 필터는 소스를 가지고 있어서 애노테이션을 붙일 수 있다.
2) DD File(web.xml)
<filter>...</filter>
<filter-mapping>...</filter-mapping>
남이 만든 필터 클래스는 소스가 없어서 애노테이션을 붙일 수 없다.
"필터 배치(deployment)"
이런 필터가 있는데 이런 요청이 들어올때 실행하라고 웹 애플리케이션에 설정하는 것!
서블릿 컨테이너는 배치된 컴포넌트만 관리한다.
컴포넌트(필터, 서블릿,리스너 등)
필터 구동 원리
HTTP Client(Web Browser) : Hyper-Text Transfer protocol 규칙을 사용해 server에 요청
HTTP Server(Web Server) : Hyper-Text Transfer protocol 규칙을 사용해 client에 응답
로그인이 필요한 요청인 경우 로그인으로 유도하기: Filter 활용
package com.bitcamp.board.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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.bitcamp.board.domain.Member;
@WebFilter("/member/*")
public class AdminCheckFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("AdminCheckFilter.init() 실행");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("AdminCheckFilter.doFilter() 실행!");
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
Member loginMember = (Member) httpRequest.getSession().getAttribute("loginMember");
if (loginMember == null || !loginMember.getEmail().equals("admin@test.com")) {
httpResponse.sendRedirect(httpRequest.getContextPath() + "/");
return;
}
chain.doFilter(request, response);
}
}
Request Line
: GET /app/auth/login?email=user1@test.com&password=1111&saveEmail=on HTTP/1.1
Request URI(URI or URN)
: /app/auth/login?email=user1@test.com&password=1111&saveEmail=on
path
: /app/auth/login
QueryString(서버에보내는 데이터)
: email=user1@test.com&password=1111&saveEmail=on
파라미터
: email=user1@test.com, password=1111, saveEmail=on
파라미터명
: email, password, saveEamil
파라미터 값
: user1@test.com, 1111, on
URL자체는 텍스트 URL에 데이터에 포함되는것들은 텍스트만 가능하다.
이미지 데이터(바이너리 데이터)를 보낼 수 없다.
base64로 변환해서 보낼 수 있지만 base64사이즈가 크면(크기가 한정되어있다) 대용량의 데이터를 보낼 수 없다.
주소창에 노출된다.(주소창에 노출되도 상관없는 데이터(검색,조회)
주소창에 노출되서는 안되는 정보(패스워드 등)
POST / --- HTTP/1.1
Host: localhost:8888
...
title: ABC%EA%B0%80%EA%B0%81%EA%B0%84
가 URL 인코딩(UTF-8) -> %EA%B0%80
각 URL 인코딩(UTF-8) -> %EA%B0%81
간 URL 인코딩(UTF-8) -> %EA%B0%84
=> Bytes
74 69 74 6c 65 3d 41 42 43 25 45 41 25 42 30 25 38 30 25 45 41 25 42 30 25 38 31 25 45 41 25 42 30 25 38 34
==> 서버에 전송(URL 디코딩) / 문자가 16진수 바이트 코드로 변환
74 69 74 6c 65 3d 41 42 43 EA BO 80 EA BO 81 EA BO 84
==> getParameter("title)
Unicode2(UTF-16) 코드로 변환(자바문자(2byte) char
==> UTF-8 한글 코드를 ASCII코드와 같은 방식으로 변환하는 문제가 발생 => 한글 깨짐
content: ABC%EA%B0%80%EA%B0%81%EA%B0%84
<form action='login' method="post">
<table border='1'>
<tr>
<th>이메일</th>
<td><input name='email' type='email' size='30' value='${cookie.email.value}'></td>
</tr>
<tr>
<th>암호</th>
<td><input name='password' type='password' size='30'></td>
</tr>
</table>
<p>
<input type="checkbox" name="saveEmail">이메일 저장</br>
<button type='submit'>로그인</button>
<a href='../'>취소</a>
</p>
</form>
//protected void doGet(HttpServletRequest request, HttpServletResponse response)
// throws ServletException, IOException {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {