Spring MVC session处理---@SessionAttributes
2017-10-24 11:51
731 查看
转载自:BazingaLyncc的博客 http://blog.csdn.net/linuu/article/details/51037943
介绍
在web开发中,session的重要性不言而喻,与cookie相比,session更加安全,处于服务器端,开发者经常把一些重要的信息放在session,方便在多次请求中方便的获取信息,Spring MVC 对session的支持也依旧很强大很灵活
Spring MVC对session的支持分为两种
基于HttpSession的天然支持
基于注解@SessionAttributes的灵活多变的支持
首先我们先一起分析一下基于天生的HttpSession的支持吧
假如用户登录的时候,我们把用户信息记录到session中
我们先请求 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的,我们举例说明
上面代码中,我们注解了@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中的值,代码如下
这样依旧能获取到值,不过要注意
最后我们再看看@SessionAttributes这个注解
都是数组型的,也就说可以支持多个对象放入session中,举例说明
测试结果:
介绍
在web开发中,session的重要性不言而喻,与cookie相比,session更加安全,处于服务器端,开发者经常把一些重要的信息放在session,方便在多次请求中方便的获取信息,Spring MVC 对session的支持也依旧很强大很灵活
Spring MVC对session的支持分为两种
基于HttpSession的天然支持
基于注解@SessionAttributes的灵活多变的支持
首先我们先一起分析一下基于天生的HttpSession的支持吧
假如用户登录的时候,我们把用户信息记录到session中
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的,我们举例说明
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中的值,代码如下
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这个注解
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中,举例说明
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; } }
测试结果:
相关文章推荐
- Spring MVC @SessionAttributes注解
- spring mvc @SessionAttributes的坑爹之处
- SpringMVC SessionAttributes 简述
- shiro +springmvc+freemarker session问题处理 shiro无法记录登陆前页面问题
- How to use Session attributes in Spring-mvc
- SpringMVC @SessionAttributes 使用详解以及源码分析
- Spring MVC整理系列(05)————Spring MVC配置解析及整合SpriSpring MVC之@ModelAttribute、@SessionAttributes以及Model的使用介绍
- Spring MVC @SessionAttributes注解
- Spring MVC @SessionAttributes
- SpringMVC @SessionAttributes 使用详解以及源码分析
- Spring MVC @SessionAttributes注解
- Extjs springmvc session 超时 处理
- Springmvc @SessionAttributes 的使用
- Spring MVC @SessionAttributes注解
- Spring MVC @SessionAttributes注解
- Understanding Spring MVC Model and Session Attributes
- springmvc @SessionAttributes和@ModelAttribute的正确使用
- 待翻译---- Understanding Spring MVC Model and Session Attributes
- 基于Eclipse Maven的Spring4/Spring-MVC/Hibernate4整合之十:Spring mvc & hibernate 事务处理(回滚)
- spring mvc+ajax 问转调查传参处理