GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Servlet

[[ Session /applicaiton ]] 공유데이터를 서버에 저장 => set / get

Backcoder 2022. 8. 8. 20:49
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: 모두 / 계속유지, 서버종료시 소멸 ) 

 

 

=> 필요에 따라, 적절한 공유방법을 사용하자!