1. 程式人生 > >Spring MVC系列(四)之session處理[email

Spring MVC系列(四)之session處理[email

介紹

       在web開發中,session的重要性不言而喻,與cookie相比,session更加安全,處於伺服器端,開發者經常把一些重要的資訊放在session,方便在多次請求中方便的獲取資訊,Spring MVC 對session的支援也依舊很強大很靈活

Spring MVC對session的支援分為兩種

基於HttpSession的天然支援

基於註解@SessionAttributes的靈活多變的支援

首先我們先一起分析一下基於天生的HttpSession的支援吧

加入使用者登入的時候,我們把使用者資訊記錄到session中

package org.study.lyncc.web.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.study.lyncc.web.entity.User;

@Controller
public class SessionAttributesController {
    
    /**
     * user物件存入session
     * @param id
     * @param name
     * @param session
     * @return
     */
    @RequestMapping("/session/test/{id}/{name}")
    public ModelAndView localsessionAttributes(@PathVariable Integer id,@PathVariable String name,HttpSession session){
        session.setAttribute("currentUser", new User(id,name));
        ModelAndView mav = new ModelAndView("session");
        return mav;
    }
    
    /**
     * 獲取session中的user物件
     * @param session
     * @return
     */
    @RequestMapping("/session/attributes")
    public ModelAndView sessionAttributesage(HttpSession session){
        User u = (User)session.getAttribute("currentUser");
        System.out.println(u.getUsername());
        ModelAndView mav = new ModelAndView("session");
        return mav;
    }
    
}
我們先請求http://localhost:8080/spring-mvc/session/test/1/lyncc

然後我們再次請求http://localhost:8080/spring-mvc/session/attributes

會發現我們可以衝session取出我們上次請求存入session的user物件,併成功列印user的名字

基於@SessionAttributes註解實現的對session的管理

SessionAttributes是隻能註解於類或者介面,@SessionAttributes的value代表我們需要把什麼樣的物件放入session,在我們的方法後當我們把物件放入ModelMap這個物件的時候,如果給出的key也會自動放入session的,我們舉例說明

package org.study.lyncc.web.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import org.study.lyncc.web.entity.User;

@Controller
@SessionAttributes(value="currentUser")
public class SessionAttributesController {
    
    
    
    @RequestMapping("/session/attributes/{id}/{name}")
    public ModelAndView sessionAttributes(@PathVariable Integer id,@PathVariable String name){
        ModelAndView mav = new ModelAndView("session");
        mav.addObject("currentUser", new User(id,name));
        return mav;
    }
    
    /**
     * 獲取session中的user物件
     * @param session
     * @return
     */
    @RequestMapping("/session/attributes")
    public ModelAndView sessionAttributesage(HttpSession session){
        User u = (User)session.getAttribute("currentUser");
        System.out.println(u.getUsername());
        ModelAndView mav = new ModelAndView("session");
        return mav;
    }
    
}

上面程式碼中,我們註解了@SessionAttributes,並且在sessionAttributes方法中,mav.addObject("currentUser", new User(id,name));我們建立一個物件放入ModelAndView中,因為@SessionAttributes的value與addObject的key值相同,所以該User會自動存入session中(上面說是ModelMap物件,其實看原始碼就知道ModelAndView的model就是ModelMap)

好了,我們測試一下,先執行http://localhost:8080/spring-mvc/session/test/1/lyncc

再執行http://localhost:8080/spring-mvc/session/attributes,測試結果

能獲取到值,說明user放入session成功了

我們除了顯性的從HttpSession中獲取物件,我們還可以利用@ModelAttribute與@SessionAttributes相互配合,隱性的獲取到放在session中的值,程式碼如下

package org.study.lyncc.web.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import org.study.lyncc.web.entity.User;

@Controller
@SessionAttributes(value="currentUser")
public class SessionAttributesController {
    
    
    
    @RequestMapping("/session/attributes/{id}/{name}")
    public ModelAndView sessionAttributes(@PathVariable Integer id,@PathVariable String name){
        ModelAndView mav = new ModelAndView("session");
        mav.addObject("currentUser", new User(id,name));
        return mav;
    }
    
    
    @RequestMapping("/session/attributes/test")
    public ModelAndView sessionAttributesage(@ModelAttribute("currentUser") User u){
        System.out.println(u.getUsername());
        ModelAndView mav = new ModelAndView("session");
        return mav;
    }


}
這樣依舊能獲取到值,不過要注意

最後我們再看看@SessionAttributes這個註解



package org.springframework.web.bind.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface SessionAttributes {

	
	@AliasFor("names")
	String[] value() default {};

	
	@AliasFor("value")
	String[] names() default {};

	
	Class<?>[] types() default {};

}
都是陣列型的,也就說可以支援多個物件放入session中,舉例說明
package org.study.lyncc.web.controller;

import java.util.Date;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import org.study.lyncc.web.entity.User;

@Controller
@SessionAttributes(value={"currentUser","saveTime"},types={User.class,Date.class})
public class SessionAttributesController {
    
    @RequestMapping("/session/attributes/{id}/{name}")
    public ModelAndView sessionAttributes(@PathVariable Integer id,@PathVariable String name){
        ModelAndView mav = new ModelAndView("session");
        mav.addObject("currentUser", new User(id,name));
        mav.addObject("saveTime", new Date());
        return mav;
    }
    
    
    @RequestMapping("/session/attributes/test")
    public ModelAndView sessionAttributesage(@ModelAttribute("currentUser") User u,@ModelAttribute("saveTime") Date d){
        System.out.println(u.getUsername());
        System.out.println(d);
        ModelAndView mav = new ModelAndView("session");
        return mav;
    }
}
測試結果:

好了,這節END~