- 0929

Yung·2022년 9월 29일
0

Java223bitcamp

목록 보기
12/26

필터 만들기

Filter
필터 객체 생성은 서블릿과 다르게 웹애플리케이션이 시작할 때 생성된다.
init() : 필터 객체 생성 후 즉시 호출된다(필터가 작업하는데 필요한 자원을 준비 시키는 코드를 둔다)
doFilter() : 요청이 들어올때 호출 된다.
destory() : 웹애플리케이션이 멈출때 호출된다.(init()에서 준비한 자원을 해제시키는 코드를 둔다)

  1. 필터 배치
    1) 애노테이션
    @WebFilter(url)
    자기가 만든 필터는 소스를 가지고 있어서 애노테이션을 붙일 수 있다.

    2) DD File(web.xml)

    <filter>...</filter>
    <filter-mapping>...</filter-mapping>

    남이 만든 필터 클래스는 소스가 없어서 애노테이션을 붙일 수 없다.

"필터 배치(deployment)"
이런 필터가 있는데 이런 요청이 들어올때 실행하라고 웹 애플리케이션에 설정하는 것!
서블릿 컨테이너는 배치된 컴포넌트만 관리한다.
컴포넌트(필터, 서블릿,리스너 등)

067. 필터로 로그인 검사하기

필터 구동 원리
HTTP Client(Web Browser) : Hyper-Text Transfer protocol 규칙을 사용해 server에 요청
HTTP Server(Web Server) : Hyper-Text Transfer protocol 규칙을 사용해 client에 응답

로그인이 필요한 요청인 경우 로그인으로 유도하기: Filter 활용

  • 2단계 - 관리자 여부를 검사하는 필터를 만든다.
    • com.bitcamp.board.filter.AdminCheckFilter 클래스 생성
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);
  }
}

HTTP GET 요청

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사이즈가 크면(크기가 한정되어있다) 대용량의 데이터를 보낼 수 없다.
주소창에 노출된다.(주소창에 노출되도 상관없는 데이터(검색,조회)
주소창에 노출되서는 안되는 정보(패스워드 등)

HTTP POST 장점

HttpServlet 클래스와 GET/POST 요청

POST 방식 요청에서 한글 깨지는 원리

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

068. POST 방식으로 데이터 보내기: GET/POST 구분

  • GET/POST 요청의 특징 이해
  • GET 방식 요청 프로토콜 이해
  • POST 방식 요청 프로토콜 이해
  • 1단계 - 로그인 요청을 POST 형식으로 변경한다.
  • /webapp/auth/form.jsp 변경
<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>
  • com.bitcamp.board.controller.LoginController 변경
//protected void doGet(HttpServletRequest request, HttpServletResponse response)
//      throws ServletException, IOException {

protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
  • 2단계 - 게시글 등록 및 변경도 POST 방식으로 변경한다.
  • /webapp/board/form.jsp 변경
  • /webapp/board/detail.jsp 변경
  • com.bitcamp.board.controller.BoardAddController 변경
  • com.bitcamp.board.controller.BoardUpdateController 변경
  • 3단계 - 회원 등록 및 변경도 POST 방식으로 변경한다.
  • /webapp/member/form.jsp 변경
  • /webapp/member/detail.jsp 변경
  • com.bitcamp.member.controller.BoardAddController 변경
  • com.bitcamp.member.controller.BoardUpdateController 변경

0개의 댓글