ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Servlet] 서블릿 session? 유지하는법?
    자바웹프로그래밍/servlet 2020. 11. 12. 11:13
    728x90
    반응형

    *글을 읽기전 광고 클릭은 제게 큰 힘이됩니다!

    Servlet 서블릿에 session을 알아보기 이전에 세션이 무엇인지에 관하여 이해가 먼저라고 생각한다.

     

     SESSION 이란?

     

    일정 시간동안 같은 사용자(정확하게 브라우저 및 클라이언트라고 부른다)로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이다. 클라이언트의 요청에 따른 정보를 클라이언트 메모리에 저장하는 것이 아닌 웹 서버가 세션아이디 파일을 만들어 서브시가 돌아가고 있는 서버에 저장하는 것이다. 서버에 저장되기 때문에 사용자 정보가 노출되지 않는다는 장점이있다.

     

    1. 세션의 원리

     - 세션 ID를 서버에서 클라이언트로 발급해 준다.

     - 서버에서 클라이언트로 발급해준 세션 ID를 쿠리를 사용해 저장한다.

     - 클라이언트는 다시 접속시, 이 쿠키 및 localstorage를 이용해서 세션 ID값을 전달한다.

     

    2. 세션의 장점

     - 각 클라이언트에게 고유 ID를 부여한다.

     - 세션 ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공할수 있다.

     - 사용해봤떤 정보들을 서버에 저장하기에 보안성이 높다

     

    3. 세션의 단점

     - 서버에 저장하기에 처리를 요구하는 부하와 저장 공간을 필요로 한다.

     

    4. HTTP 세션 동작 순서

      - client가 서버로 접속을 시도

      - 서버는 접근한 클라이언트의 request-header filed인 쿠리를 확인해 클라이언트가 해당 session-id를 보내왔는지 확인한다.

      - 만약 클라이언트로부터 발송된 session-id가 없다면, 서버는 session-id를 생성해 클라이언트에게 response-head field인 set cookie 값으로 sesion -id 발행한다.

     

    이상으로 Session에 대해 배워보았고 이제 java servlet에 session 방식을 배워보자

     


     

    java servlet은 HttpSession이라는 인터페이스가 있고 검색,저장,삭제를 가능하게 한다.

     

    서블릿은 getSession을 통해 세션 객체에 접근하며, HttpSessionRequest객체를 이용한다.

     

    세션 범위에 데이터를 저장히기 위해선 setAttribute 메소드를 반드시 이용하여 저장해야한다 검색할때는 getAttribute를 쓴다.

     

    web.xml

    <servlet>
      	<servlet-name>HelloWorld</servlet-name>
      	<servlet-class>servlet.hello</servlet-class> 	
        </servlet>
        
      	<servlet-mapping>
    		<servlet-name>HelloWorld</servlet-name>
    		<url-pattern>/HelloWorld</url-pattern>
    	</servlet-mapping>
    	
    	
    	 <servlet>
      	<servlet-name>loginsession</servlet-name>
      	<servlet-class>servlet.loginservlet</servlet-class> 	
        </servlet>
        
      	<servlet-mapping>
    		<servlet-name>loginsession</servlet-name>
    		<url-pattern>/loginsession</url-pattern>
    	</servlet-mapping>

     

    일단 web.xml에 서블릿 두개를 맵핑하도록한다. 이유는 hello servlet에서 로그인 서비스를 불러온뒤 로그인이 성공하면 session아이디를 받고 그 session아이디를 servlet session에 담아둔뒤 dispatcher를 이용하여 login.jsp로 사용자에게 전달한뒤 다시 login.jsp에서 loginsession으로 post를 보내어 getSession으로 session값이 저장되어있는지 확인하기 위함이다. 

     

     

    test.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form method="post" action="/HelloWorld">
    		<input class="s_input" name="id" type="text" size="35" title="검색" value="" maxlength="155">
    		<input class="s_input" name="password" type="text" size="35" title="검색" value="" maxlength="155">
    		<input type="submit" class="s_btn" value="조회" title="조회" >
    	</form>
    </body>
    </html>

     

    test.jsp를 만들어 /Helloworld에 아이디와 비밀번호 정보를를 넘기는 input을 생성하고 post로 servlet에 보내준다. 

     

     

    login.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form method="post" action="/loginsession">
    	
    	
    	<input type="submit" class="s_btn" value="전송">
    	</form>
    </body>
    </html>

    servlet에서 받은 session값이 request로 loginservlet에 전달되는지 확인하기위에 login.jsp를 이용하여 /loginsession에 request를 보내본다.

     

     

    hello.java

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		
    		ServletContext context = getServletContext();
    		RequestDispatcher dispatcher = context.getRequestDispatcher("/jsp/test/login.jsp");
    		
    		dispatcher.forward(request, response);
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		HttpSession session = request.getSession();
    		System.out.println("asd--------------asdasd");
    		String id =(String)request.getParameter("id");
    		String password=(String)request.getParameter("password");
    		
    		service sv = new service();
    		String sessionId =sv.login(id,password);
    	        
    		session.setAttribute("session_id", sessionId);
    		
    		
    		System.out.println(id+"password"+password);
    		
    		doGet(request, response);
    	}

    service를 이용하여 sessionId를 받아오고 HttpSession에 sessionId를 담는다. 그후 dispatcher를 이용하여 login.jsp로 보내준다.

     

     

    loginservlet.java

    public class loginservlet extends HttpServlet {
    	
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		super.doGet(req, resp);
    	}
    	
    	
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		HttpSession session = req.getSession();
    		
    		String sessionId = (String) session.getAttribute("session_id");
    		
    		System.out.println("sessionId ==="+sessionId);
    		
    		// TODO Auto-generated method stub
    		super.doPost(req, resp);
    	}
    }

    login.jsp에서 post를 loginservlet으로 보내 session_id가 잘담겨있는지 확인한다.

     

     

     

    test.jsp에서 아이디와 비밀번호를 누른뒤 조회! -> servlet에서 세션아이디를 담는다 -> dispatcher로 login.jsp를 사용자에게 돌려줌

    login.jsp에서 전송버튼을 눌러 loginservlet에서 session아이디가 저장되어있는지 확인한다!

     

     

     

     

    이대로 진행하면 위에처럼 sysout에 sessionId가 잘 전달된것을 확인할수있습니다.

    728x90
    반응형
Designed by Tistory.