RequestDispatcher rd = req.getRequestDispatcher("second");
- RequestDispatcher 는 공유할 서블릿을 '하나' 지정해서 1 : 1 로 공유하는 관계였다면,
공유할 서블릿 : setAttribute => 서블릿 지정 => forward(req,resp)
공유받을 서블릿 : getAttribute
이를 확장시켜서,
- 하나의 서블릿 데이터를 => 다른 모든 서블릿에서 가져다 사용할 수 있게 해주는 게, Session 이다.
공유할 서블릿 : Session생성 => setAttribute
공유받을 서블릿 : Session생성 => getAttribute
[[ Session ]]
: 공유할 클라이언트 정보가 있으면, 서버의 메모리에 저장해놓고 지속 사용 하는 방법
( 정보저장 주체 => 서버 )
- Java 객체 이용해서 추출하고 저장 가능
- 해당 서버, 해당 컨텍스트 내에서 사용
- 정보가 서버의 메모리에 저장
- 쿠키보다 보안에 유리
- 브라우저 당 한개의 세션이 생성됨
- 유효기간을 가짐 ( 액션 없이 기본 30분 )
- 브라우저가 닫히면 끝남
- 서버에 부하를 줄 수 있음
- 로그인상태 유지 / 장바구니 담기 등의 기능에 사용
- JSP <==> 서블릿
: session 주고 받을 수 있다.
순서
1. 브라우저 사이트 접속
2. 서버는 접속한 최초 요청인 브라우저 마다
해당 클라이언트의 세션 객체를 생성 ( 세션 id )
- 아직 저장정보는 아무것도 없는 상태.
3. 다음 요청시 해당 세션id 객체를 공유해서 사용
@WebServlet("/loginsession")
public class LoginSesseion extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter writer = resp.getWriter();
String id = req.getParameter("id");
String pw = req.getParameter("pw");
HttpSession session = req.getSession();
session.setAttribute("sessionid", id);
(1) HttpSession session = req.getSession( );
- 최초 요청에 대해 세션 객체 생성
(2) session.setAttribute( " key 값" , value );
- 다른 서블릿 에서 공유해서 사용할 데이터를 담음
@WebServlet("/mypage")
public class MypageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
PrintWriter writer = resp.getWriter();
HttpSession session = req.getSession();
if (session.getAttribute("sessionid") != null) {
String sessionid = (String) session.getAttribute("sessionid");
writer.println("마이페이지 아이디 : " + sessionid + "확인되었습니다<br>");
} else {writer.println("session 없어도 그냥 getAttribute 없는 부분은 출력해주는거 방지 ");}
}
}
- 데이터 공유받고 싶은 서블릿이 있으면,
(1) HttpSession session = req.getSession( );
- 마찬가지로, 세션 객체 생성
(2) session.getAttribute( " key 값 " ) ;
- key 값으로 바로 받아서 사용
----------------------------------------------------------------------------------
[ Session 삭제 ]
1. removeAttirubte( "key 값" );
: 세션 내부 정보 삭제 ( 해당 정보만 삭제 )
2. session.invalidate( );
: 세션 자체를 즉각 무효화
[ Session 유지시간 ]
1. Tomcat - web.xml
: 서버 모든 session 에 적용
<session-config>
<session-timeout>30</session-timeout>
</session-config>
: 기본 세션유지시간 30분 ( 조종가능 )
2. session.setMaxInactiveInterval (60*10);
: Java에서 각 session별로 설정 가능
=> 60초 * 10 = 10분
------------------------------------------------------------------
[[ application ]]
- session 은 기본적으로 현재 웹브라우저 에서만 유지되며,
action 이 없을 시, 30분간 유지되고 사라진다.
- 웹브라우저 종료시 세션이 사라진다. (클라이언트단)
=> application 은 모든 종류 웹브라우저에서 유지된다.
( 크롬에서 생성한 어플리케이션이 엣지에서도 유지됨 )
=> 시간제한 없다.
=> 웹브라우저를 종료해도 계속 유지된다.
=> Tomcat 등 "서버"를 종료하면 사라진다.
< ServletContext > 사용
( : 서버 정보 / context 정보 / 같은 context 파일 정보 <= 이걸 이용 )
ServletContext application = request.getServletContext();
- 이렇게 객체를 생성만 해두면, 사용법은 session 과 똑같다.
application.setAttribute( )
application.getAttribute( )
- application 은 서버 종료시까지 계속 유지되므로,
=> removeAttribute( ) 의 적절한 사용도 더 필요해 보인다.
- JSP에서는 session 과 마찬가지로 내장객체로 들어가 있어서
session / applicaiton 내장객체로 바로 사용 가능하다.
- 유지시간, 공유대상의 크기로 봤을 때 이렇게 나눌 수도 있다.
RequestDispatcher (1:1 / 1회성)
<
session ( 1 : 모두 / 30분, 웹브라우저 종료시 소멸 )
<
application ( 1: 모두 / 계속유지, 서버종료시 소멸 )
=> 필요에 따라, 적절한 공유방법을 사용하자!
'Back to the Servlet' 카테고리의 다른 글
[Servlet] RequestDispatcher / set/getAttribute / sendReirect("url"); (0) | 2022.08.08 |
---|---|
[Servlet] Maven 맨바닥 Servlet 세팅 (intellij) (0) | 2022.08.06 |
Tomcat 연동 / Tomcat UTF-8 설정 ( intellij ) (0) | 2022.08.06 |
Servlet 방식 <= Spring MVC 방식 비교 (0) | 2022.08.05 |
URL Mapping / @WebServlet("/url") / web.xml 버전 (0) | 2022.08.05 |