Servlet方案

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

 package cn.sinobest.jzpt.demo.login.web;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 登陆相关Controller.<br>
* H - HttpSession.
* @author lijinlong
*
*/
@Controller
@RequestMapping("demo/h_login")
public class HLoginController { @RequestMapping("/login")
public String login(Model model, String username, HttpSession session) {
Logger.logger.debug("in HLoginController.login...");
String currUsername = session.getAttribute("username") == null ? null
: session.getAttribute("username").toString();
// 尝试从session中获取username数据。 boolean usernameIsNull = username == null || username.isEmpty();
boolean currunIsNull = currUsername == null || currUsername.isEmpty();
if (usernameIsNull && currunIsNull) {
return View.VIEW_LOGIN;
} if (!usernameIsNull) {
session.setAttribute("username", username);
// 将username缓存到session中。
}
return View.VIEW_LOGOUT;
} /**
* 注销.
* @param model
* @param session
* @return
*/
@RequestMapping("/logout")
public String logout(Model model, HttpSession session) {
Logger.logger.debug("in HLoginController.logout...");
session.removeAttribute("username");
// 将username从session中移除。
return View.VIEW_LOGIN;
}
}

LoginController.java

Spring方案

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

  1. 将数据缓存到session
    对Controller使用org.springframework.web.bind.annotation.SessionAttributes注解,可以将指定名称 或者 类型的数据,在model.addAttribute( String key,  Object value)时,缓存到session中。
  2. 清除session中的数据
    调用org.springframework.web.bind.support.SessionStatus实例的setComplete(),在方法的参数列表中声明SessionStatus类型的参数,会被自动注入。
 package cn.sinobest.jzpt.demo.login.web;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
/**
* 登陆相关Controller.<br>
* S - Spring Session.
* @author lijinlong
*
*/
@Controller
@RequestMapping("demo/s_login")
@SessionAttributes("username") // 指定了key为username的数据,会被放入session中。
public class SLoginController {
@RequestMapping("/login")
public String login(Model model, String username) {
Logger.logger.debug("in SLoginController.login...");
String currUsername = model.asMap().get("username") == null ? null
: model.asMap().get("username").toString();
// 尝试从session中获取username(spring mvc会自动把session中的数据装载到model中)。 boolean usernameIsNull = username == null || username.isEmpty();
boolean currunIsNull = currUsername == null || currUsername.isEmpty();
if (usernameIsNull && currunIsNull) {
return View.VIEW_LOGIN;
} if (!usernameIsNull) {
model.addAttribute("username", username);
// username会被放入session中(key和@SessionAttributes的参数匹配)。
}
return View.VIEW_LOGOUT;
} @RequestMapping("/logout")
public String logout(SessionStatus status,
@ModelAttribute("username") String currUsername) {
Logger.logger.debug("in SLoginController.logout...");
Logger.logger.debug("current user is:" + currUsername);
status.setComplete();
// 清除session中的attribute
return View.VIEW_LOGIN;
}
}

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}来获取数据。

在Spring Controller中将数据缓存到session的更多相关文章

  1. 1. 处理静态资源 2. controller如何接受请求得参数 3. 如何把controller得数据保存到view. 4. 在controller如何完成重定向到指定路径 5. controller返回json数据

    1. 1. 处理静态资源2. controller如何接受请求得参数3. 如何把controller得数据保存到view.4. 在controller如何完成重定向到指定路径5. controller ...

  2. [python]mysql数据缓存到redis中 取出时候编码问题

    描述: 一个web服务,原先的业务逻辑是把mysql查询的结果缓存在redis中一个小时,加快请求的响应. 现在有个问题就是根据请求的指定的编码返回对应编码的response. 首先是要修改响应的bo ...

  3. 在scrapy中将数据保存到mongodb中

    利用item pipeline可以实现将数据存入数据库的操作,可以创建一个关于数据库的item pipeline 需要在类属性中定义两个常量 DB_URL:数据库的URL地址 DB_NAME:数据库的 ...

  4. 将数据缓存到sessionStorage中

    //获取侧边栏 if (sessionStorage.getItem(`${env}${empId}leftMenu`)) { const leftMenu = JSON.parse(sessionS ...

  5. json和xml封装数据、数据缓存到文件中

    一.APP的通信格式之xml xml:扩展标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己标记语言进行定义的源语言.XML格式统一,扩平台语言,非常适合数据传输和通信,业界公认的标准. ...

  6. ASP.NET MVC中将数据从Controller传递到视图

    ASP.NET MVC中将数据从Controller传递到视图方法 1.ViewData ViewData的类型是字典数据,key-value 如:ViewData["Data"] ...

  7. Spring与Hibernate集成中的Session问题

    主要讨论Spring与Hibernate集成中的session问题 1.通过getSession()方法获得session进行操作 public class Test extends Hibernat ...

  8. Spring官网阅读(十七)Spring中的数据校验

    文章目录 Java中的数据校验 Bean Validation(JSR 380) 使用示例 Spring对Bean Validation的支持 Spring中的Validator 接口定义 UML类图 ...

  9. Spring MVC 前后台数据交互

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址地址:<Spring MVC 前后台数据交互> 1.服务端数据到客户端 (1)返回页面,Controller中方法 ...

随机推荐

  1. 51Nod 1133 不重叠的线段 | 典型贪心

    Input示例 3 1 5 2 3 3 6 Output示例 2 题意:给出n条一维线段,求不重合的最多线段数. 解析:这个是典型的贪心算法的区间问题. 贪心策略:每次取尽可能短的区间,而且保证相互之 ...

  2. Sass 颜色函数

    /* * Sass 颜色函数 * RGB 颜色函数 * 1. rgb($red,$green,$blue):根据红.绿.蓝三个值创建一个颜色: * rgb(200,40,88) //根据r:200,g ...

  3. 【Foreign】Weed [线段树]

    Weed Time Limit: 20 Sec  Memory Limit: 512 MB Description 从前有个栈,一开始是空的. 你写下了 m 个操作,每个操作形如 k v : 若 k ...

  4. 【BZOJ】1609: [Usaco2008 Feb]Eating Together麻烦的聚餐

    [算法]动态规划 [题解]DP有个特点(递推的特点),就是记录所有可能状态然后按顺序转移. 最优化问题中DP往往占据重要地位. f[i][j]表示前i头奶牛,第i头改为号码j的最小改动数字,这样每头奶 ...

  5. Katu Puzzle(POJ3678+2-SAT问题+tarjan缩点)

    题目链接:http://poj.org/problem?id=3678 题目: 题意:给你a,b,c,op,op为逻辑运算符或.与.异或,使得a op b = c,让你判断这些运算符是否存在矛盾,不存 ...

  6. js中三种定义变量 const, var, let 的区别

    js中三种定义变量的方式const, var, let的区别 1.const定义的变量不可以修改,而且必须初始化. 1 const b = 2;//正确 2 // const b;//错误,必须初始化 ...

  7. js_在原有的日期上添加天数输出添加后的日期

    开始编码工作也有段时间了,想想没有留下点什么,有点遗憾.学到的一些经验,写写,分享一下.也给自己整理一下. 今天分享一下,在原有的日期上添加天数输出添加后的日期.开始做的时候,简单的思路是,直接用ne ...

  8. poj 1298 The Hardest Problem Ever

    题目链接:http://poj.org/problem?id=1298 题目大意:按照所给的顺序要求将输入的字符串进行排列. #include <iostream> #include &l ...

  9. python进行机器学习(三)之模型选择与构建

    Scikit-Learn库已经实现了所有基本机器学习的算法,可以直接调用里面库进行模型构建. 一.逻辑回归 大多数情况下被用来解决分类问题(二元分类),但多类的分类(所谓的一对多方法)也适用.这个算法 ...

  10. Perl6 Bailador框架(6):获取用户输入

    use v6; use Bailador; get '/' => sub { ' <html> <head><title></title>< ...