필터
C언어는 컴파일러를 통해서 코드 -> 기계어로 바꾸고 실행 하는 반면 java는 JVM을 통해서 빌드하게 된다.
이때 서블릿은 요청/응답 모델이므로 컴파일 전에 무엇을 할 필요는 없다. 하지마 ㄴ요청에 대해서 전처리 작업이 필요한 경우가 있다. 이렇게 웹 클라이언트의 요청에 대해서 필요한 사전 작업이 있을 경우에 필터(filter)를 사용한다.
필터는 필터 인터페이스를 상속받아 사용한다. 필터는 서블리의 생명주기처럼 init, destroy 메서드를 가지고 있다.
필터 기능을 사용을 위한 doFilter 메서드가 있다. 실제로 필터가 서블릿보다 먼저 동작한다.
package info.thecodinglive.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.io.PrintWriter;
@WebFilter("*.jsp")
public class FilterEx implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
res.setContentType("text/html");
res.setCharacterEncoding("UTF-8");
PrintWriter out = res.getWriter();
out.println("필터 동작 전");
chain.doFilter(req, res);
out.println("필터 동작 후");
}
@Override
public void destroy() {
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>filter</title>
</head>
<body>
filter test
</body>
</html>
web 요청시 결과
필터 동작 전 filter test 필터 동작 후
필터가 동작해서 jsp에 있는 filter test 앞뒤에 doFilter 메서드 안에 있는 내용이 출력되었다. 이렇게 URL을 기준으로 요청에 대한 처리를 할 수 있고, 특정 서블릿에 대해서 매핑을 할 수 도 있다. URL 대신 서블릿을 기준으로 할 때는 서블릿 이름으로 매핑을 한다.
필터체인
필터는 여러 개를 등록해서 사용할 수 있다. 하나의 요청에 대해서 다양한 변경이 필요하다면 여러 개의 필터를 매핑해서 처리할 수 있다. 이렇게 여러 개의 필터를 등록해서 처리하는 것을 필터 체인(filter chain)이라고 한다.
쿠키
쿠키(cookie)는 사용자가 사이트를 방문했을 때, 사용자의 컴퓨터에 저장되는 정보를 말한다. 쿠키의 구성 요소는 다음과 같다.
이름 : 각각의 쿠키의 갑을 식별하기 위한 키
값 : 특정 이름으로 쿠키에 지정된 값
유효 시간 : 쿠키의 유지 시간
도메인 : 쿠키를 전송할 도메인
경로 : 쿠키를 전송할 요청 경로
쿠키는 javax.servlet.http에 있다.
map 처럼 key,value 값으로 매핑한다. (도메인과 최대 유효시간 등을 설정 가능)
package info.thecodinglive.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/newcookie")
public class CookieCreateServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req,
HttpServletResponse resp) throws ServletException,
IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html><head><title> 쿠키 예제</title></head><body>");
out.println("<br/>");
Cookie jcookie = new Cookie("jpub", "books");
jcookie.setMaxAge(3600);
resp.addCookie(jcookie);
out.println("<a href='/readcookie'>readcookie</a></body></html>");
}
}
쿠키를 사용할 때 보통 도메인 기반으로 사용한다. 예를 들어, ebook.jpub.com , it.jpub.com과 같은 사이트를 가지고 있고, jpub.com이라는 도메인을 가진 사이트에서만 허용하고 싶다면 쿠키 생성 시에 setDomain 메서드를 사용 가능한 도메인을 지정할 수 있다.
ex ) cookie.setDomain("*.jpub.com")
이 뒤에도 쿠기 수정 쿠기 삭제 등이 있다. 쿠키 삭제는 쿠키의 설정시간을 0으로 하는 방법으로 삭제 할 수 있다.
세션
세션(session)은 서버와 클라이언트의 유효한 커넥션을 식별하는 정보다. 그래서 서버는 클라이언트가 요청을 보내면 요청을 식별할 수 있는 ID를 부여하는데, 이 ID가 세션 ID다. 세션 ID는 JESSIONID란 이름으로 쿠키로 저장되고, 클라이언트가 재접속할 때 해당 쿠키를 이용해 세션 ID 값을 서버에 전달한다. 서블릿에서는 세션이 javax.servlet.http 패키지에 HttpSession 인터페이스로 정의되어 있다.
package info.thecodinglive.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/createse")
public class CreateSessionValueServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>세션</title></head><body>");
HttpSession session = req.getSession();
session.setAttribute("jpub", "book");
out.println("세션이 생성되었습니다.");
out.println("<a href='/readse'>세션 읽기</a></body></html>");
}
}
getId : 세션의 고유 아이디를 얻을 수 있는 메서드이다.
getCrationTime : 세션이 생성된 시간을 얻을 수 있는 메서드다.
getLastAccessTime : 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 얻을 수 있는 메서드다.
'개인공부' 카테고리의 다른 글
SpringBoot 란? (0) | 2020.08.09 |
---|---|
엔터프라이즈 어플리케이션 (0) | 2020.08.08 |
MultiPartConfig 어노테이션 (0) | 2020.08.08 |
인터넷 페이지가 보이는 과정 (0) | 2020.08.01 |
spring 을 aws에서 실행시켜보자. (0) | 2020.07.31 |