java缓存session_在Spring Controller中将数据缓存到session

Servlet方案

在Controller的方法的参数列表中,添加一个javax.servlet.http.HttpSession类型的形参。spring mvc会 自动把当前session对象注入这个参数,此后可以使用setAttribute(String key, Object value)将数据缓存到session,使用removeAttribute( String key)将指定的数据从session缓存中移除。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecn.sinobest.jzpt.demo.login.web;2 importjavax.servlet.http.HttpSession;3 importorg.springframework.stereotype.Controller;4 importorg.springframework.ui.Model;5 importorg.springframework.web.bind.annotation.RequestMapping;6 /**

7 * 登陆相关Controller.
8 * H - HttpSession.9 *@authorlijinlong10 *11 */

12 @Controller13 @RequestMapping("demo/h_login")14 public classHLoginController {15

16 @RequestMapping("/login")17 publicString login(Model model, String username, HttpSession session) {18 Logger.logger.debug("in HLoginController.login...");19 String currUsername = session.getAttribute("username") == null ? null

20 : session.getAttribute("username").toString();21 //尝试从session中获取username数据。

22

23 boolean usernameIsNull = username == null ||username.isEmpty();24 boolean currunIsNull = currUsername == null ||currUsername.isEmpty();25 if (usernameIsNull &&currunIsNull) {26 returnView.VIEW_LOGIN;27 }28

29 if (!usernameIsNull) {30 session.setAttribute("username", username);31 //将username缓存到session中。

32 }33 returnView.VIEW_LOGOUT;34 }35

36 /**

37 * 注销.38 *@parammodel39 *@paramsession40 *@return

41 */

42 @RequestMapping("/logout")43 publicString logout(Model model, HttpSession session) {44 Logger.logger.debug("in HLoginController.logout...");45 session.removeAttribute("username");46 //将username从session中移除。

47 returnView.VIEW_LOGIN;48 }49 }

LoginController.java

Spring方案

spring mvc提供了内嵌的支持方案:

将数据缓存到session

对Controller使用org.springframework.web.bind.annotation.SessionAttributes注解,可以将指定名称 或者 类型的数据,在model.addAttribute( String key,  Object value)时,缓存到session中。

清除session中的数据

调用org.springframework.web.bind.support.SessionStatus实例的setComplete(),在方法的参数列表中声明SessionStatus类型的参数,会被自动注入。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecn.sinobest.jzpt.demo.login.web;2 importorg.springframework.stereotype.Controller;3 importorg.springframework.ui.Model;4 importorg.springframework.web.bind.annotation.ModelAttribute;5 importorg.springframework.web.bind.annotation.RequestMapping;6 importorg.springframework.web.bind.annotation.SessionAttributes;7 importorg.springframework.web.bind.support.SessionStatus;8 /**

9 * 登陆相关Controller.
10 * S - Spring Session.11 *@authorlijinlong12 *13 */

14 @Controller15 @RequestMapping("demo/s_login")16 @SessionAttributes("username") //指定了key为username的数据,会被放入session中。

17 public classSLoginController {18 @RequestMapping("/login")19 publicString login(Model model, String username) {20 Logger.logger.debug("in SLoginController.login...");21 String currUsername = model.asMap().get("username") == null ? null

22 : model.asMap().get("username").toString();23 //尝试从session中获取username(spring mvc会自动把session中的数据装载到model中)。

24

25 boolean usernameIsNull = username == null ||username.isEmpty();26 boolean currunIsNull = currUsername == null ||currUsername.isEmpty();27 if (usernameIsNull &&currunIsNull) {28 returnView.VIEW_LOGIN;29 }30

31 if (!usernameIsNull) {32 model.addAttribute("username", username);33 //username会被放入session中(key和@SessionAttributes的参数匹配)。

34 }35 returnView.VIEW_LOGOUT;36 }37

38 @RequestMapping("/logout")39 publicString logout(SessionStatus status,40 @ModelAttribute("username") String currUsername) {41 Logger.logger.debug("in SLoginController.logout...");42 Logger.logger.debug("current user is:" +currUsername);43 status.setComplete();44 //清除session中的attribute

45 returnView.VIEW_LOGIN;46 }47 }

LoginController

SessionAttributes的使用方法

匹配单一的key

@SessionAttributes("username") //匹配key=username的数据

匹配key数组

@SessionAttributes({"username", "password"}) //匹配key=username或者password的数据

匹配单一类

@SessionAttributes(types=String.class) //匹配String类型的数据

匹配类数组

@SessionAttributes(types={String.class, List.class}) //匹配String类型或List类型的数据

混合匹配

@SessionAttributes(value={"username", "password"}, types={String.class, List.class})

ModelAttribute

使用ModelAttribute,可以自动将session中指定的参数注入到方法的形参;但是如果session中没有指定的参数,会抛出异常:

org.springframework.web.HttpSessionRequiredException: Session attribute 'username' required - not found in session

Model中的数据

Spring 会把Session中的数据装载到Model中,所以使用model.asMap().get("username")可以获取 session中的数据。返回页面前,spring会把Model中的数据放入requestScope,所以在页面可以使 用${requestScope.username}来获取数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值