[Spring] - Session Tracking


Spring Ben Controllerのセッション追跡テクノロジー

  • Cookie API
  • HttpSession
  • @SessionAttribute
  • テスト用Cookie&Ssessionオブジェクト:
     <%
     	//test용 Cookie 데이터 생성해서 client에게 전송
     	Cookie c = new Cookie("id", "cookieData");
     	c.setMaxAge(60*60);
     	response.addCookie(c);
     	
     	//test용 Session 데이터 저장
     	session.setAttribute("id", "tester");
     	session.setAttribute("age", 100);
     %>
    Controller :
    package controller;
    
    import ...
        
    @Controller
    @RequestMapping("sessiontracking")
    public class Step03Controller {
    	...
    }

    1. Cookie API

    <a href="sessiontracking/cookietest">@CookieValue</a>
    	@RequestMapping("/cookietest")
    	public String m1(@CookieValue("id") String idValue) {
    		System.out.println("m1() -- " + idValue);
            // 출력 결과 : "m1() -- " + cookieData"
    	}
    🔵 (@CookieValue("id") String idValue) クッキーの「id」というキー値に格納されているデータをString idValue変数として返します。

    2. HttpSession

    <a href="sessiontracking/sessionTest1">HttpSession API 활용 </a>
    	    @RequestMapping("/sessionTest1")
    	    public String m2(HttpSession session) {
    	       	session.getAttribute("id"));
    	        session.getAttribute("age"));
    
    	        session.setAttribute("newData", "서버에서 새로 저장한 데이터");
    	        return "redirect:/step03Session.jsp";
    	    }
    	    @RequestMapping("/sessionDelete")
    	    public String m3(HttpSession session) {
    	    	System.out.println("m3()---");
    	    	session.invalidate();
    	    	session = null;
    	    	
    			return "redirect:/step03Session.jsp";
    	    }
    🔵 (HttpSession session) セッションデータは、サーブレットと同じHttpSessionオブジェクトとして使用できます。 🔵 セッションの初期化 session.invalidate(); セッション初期化後にNull値を返す

    3. @SessionAttribute


    ✅ Spring Controller Session Tracking
    @Controller
    @RequestMapping("sessiontracking")
    @SessionAttributes({"id", "age", "cust"})
    public class Step03Controller {
     	...   
    }
    🔵 クラスの親に宣言 🔵 @SessionAttributes({}) セッションのキー値を指定する配列。

    👀 セッションデータのインポート

    	    @RequestMapping("/sessionTest2")
    	    public String m4(@ModelAttribute("id") String id,
    	    				 @ModelAttribute("age") int age) {
    	    	
    	    	return "redirect:/step03Session.jsp";
    	    }
    🔵 (@ModelAttribute("id") String id, @ModelAttribute("age") int age) セッションにidとage keyを持つデータの取得 🚩 @ModelAttributeはリクエスト中だと思っていたのですが…!? @SessionAttributeで指定したキー値が存在しない場合、要求します。jspから${requestScope.id}に出力できるのは、実行時にsetAttribute(「id」,id)と類似し、転送方式である場合のみです。 🤪❓ forward方式で、@SessionAttributeで指定したキー値であれば、${RequestScope.id}&${SessionScope.id}が利用可能です(なぜRequestScopeも利用可能なのか分かりません)😭)

    @SessionStatus


    ストレージセッションデータの初期化
    	    @RequestMapping("/sessionDelete2")
    	    public String m5(SessionStatus status) {
    	    	System.out.println("m5()--- ");
    	    	
    	    	status.setComplete();
    
    	    	return "redirect:/step03Session.jsp";
    	    }
    🔵SessionStatus API setComplete()メソッドを使用してセッションを初期化する

    ++ 👀 @Model APIを使用したQuery Stringデータの使用


    @PathParam & DTO.class
    	    @RequestMapping("sessionTest3DTO")
    	    public String m6(Model model, 
                             @PathParam("id") String id, 
                             @PathParam("age") int age) {
                
    	    	model.addAttribute("id", id);
                model.addAttribute("id", id);
    	    	
    	    	return "redirect:/step03Session.jsp";
    	    }
    🔵@PathParamを使用して各データを取得するか、Query Stringに一致する変数からなるDTOを使用します。

    🚩❕❕ HttpSession&SessionAttributesの仕事の違い


  • 他のAPIを使用してセッションにデータを追加できますが、初期化方法は独立しています.
  • HttpSessionの初期化方式invalidate()は、@SessionAttributesにおいて指定されたキー値を有するセッションデータを削除することができない
  • HttpSessiongetAtrribute()およびsetAttribute()は、@SessionAttributeに指定された鍵のデータを返し、追加するために使用され得る