Spring MVC 中使用session是一种常见的操作,但是大家上网搜索一下可以看到获取session的方式方法五花八门,最近,自己终结了一下,将获取session的方法记录下来,以便大家共同学习进步。

第一种:将HttpSession作为Spring MVC 的方法参数传入,直接获取。

直接在Spring MVC 的方法中将参数传入:

public void getSessionAction(HttpSession session){
}

这种方法我再网上搜索时发现很多人并不推荐使用,但是在简单的测试中发现,还是可以使用的,不推荐的具体原因很多文章中并没有说明。

第二种:将HttpServletRequest作为Spring MVC 的方法参数,间接获取

先是获取到request,然后通过request间接的获取到session,代码如下:

public void getSessionAction(HttpServletRequest request){
HttpSession session = request.getSession();
}

这种方法时比较常见的一种,但是有些人会觉得这种比较麻烦,因为每次使用session都需要传入一个参数(你到底是有多懒),于是就有了第三种方法

第三种:通过@Autowired HttpServletRequest request 获取

这种方式类似于我们注入service类的时候是一样的,第一眼看到这种方式的时候我是拒绝的,因为我们都知道,servlet是默认采用单例多线程的方式处理多用户请求的,如果直接把它写成一个全局的变量,会不会是不安全的?不过这里·基于spring注解的,所以基本上可以确保线程的安全性。但是说实在,我还是不放心,于是上网查了一些资料,最后看了看spring这部分的源码(我会在另一片文章中详细和大家讨论的),最后发现这样做是完全可行的。

第四种:使用RequestContextHolder类获取request,间接获取到session

通过使用RequestContextHolder这个类我们可以在不传入HttpServletRequest,直接获取到本次请求中的request。一般使用中我们会对它进行封装,做成一个工具方法进行使用:

((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

注意进行强转成为ServletRequestAttributes,具体原因可以在源码中找到(有点废话了),大致的原理就是,RequestContextHolder类中有两个ThreadLocal保存当前线程下的request,每次我们调用getRequestAttributes()的时候就会获取到当前的request,调用springmvc方法的时候没有传入request,那么这个request是在哪里获取到的呢?看源码可以知道,是在一个processRequest(HttpServletRequest request, HttpServletResponse response)这个方法里面,每次挑用doget(),dopost()的时候都会条用这个方法,将我们的request,response传进去。

第五种: 使用@SessionAttributes

确切来说这种方式并不是直接获取到session,但是我们可以通过这种方式将我们想要值放入到session中去。

其实总结是一个好习惯,在总结获取session的方法过程中,看到了去多相关的博文,学习了一些意想不到的东西,所以想要拿出来,大家一起讨论,如果还有需要补充的或者是错误之处,烦请指教。

Spring MVC 中获取session的几种方法的更多相关文章

  1. Spring MVC中forward请求转发2种方式(带参数)

    Spring MVC中forward请求转发2种方式(带参数) http://www.51gjie.com/javaweb/956.html  

  2. spring MVC中获取request和response:

    spring MVC中获取request和response: HttpServletRequest request = ((ServletRequestAttributes) RequestConte ...

  3. Spring MVC中获取当前项目的路径

    Spring MVC中获取当前项目的路径 在web.xml中加入以下内容 <!--获取项目路径--> <context-param> <param-name>web ...

  4. PHP中获取星期的几种方法

    PHP中获取星期的几种方法   PHP星期几获取代码: 1 date(l); 2 //data就可以获取英文的星期比如Sunday 3 date(w); 4 //这个可以获取数字星期比如123,注意0 ...

  5. Spring中获取request的几种方法,及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  6. [No000016E]Spring 中获取 request 的几种方法,及其线程安全性分析

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  7. Spring中获取request的几种方法,及其线程安全性分析(山东数漫江湖)

    前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...

  8. Spring MVC中处理静态资源的多种方法

    处理静态资源,我想这可能是框架搭建完成之后Web开发的”头等大事“了. 因为一个网站的显示肯定会依赖各种资源:脚本.图片等,那么问题来了,如何在页面中请求这些静态资源呢? 还记得Spring MVC中 ...

  9. spring mvc 中获取HttpServletRequest ,HttpServletResponse

    spring中的bean最常用的 singleton 模式 如果要在springmvc Controller 中获取  HttpServletRequest ,HttpServletResponse ...

随机推荐

  1. Java8学习(3)- Lambda 表达式

    猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...

  2. 【Java IO流】RandomAccessFile类的使用

    RandomAccessFile类的使用 RandomAccessFile类是java提供的对文件内容的访问,既可以读文件,也可以写文件. 支持随机访问文件,可以访问文件的任意位置. RandomAc ...

  3. C#中的Infinity和NaN

    C#中double和float类型有两个特殊值: Infinity(无穷大):5.0 / 0.0 = Infinity NaN(not a number):0.0 / 0.0 = NaN 计算表达式 ...

  4. Storm/JStorm之TopologyBuilder源码阅读

    在Strom/JStorm中有一个类是特别重要的,主要用来构建Topology的,这个类就是TopologyBuilder. 咱先看一下简单的例子: public static void main(S ...

  5. MySQL学习笔记(一):SQL基础

    定义:SQL即Structure Query Language(机构化查询语言)的缩写,是使用关系数据库的应用语言. 包括三个类别: (1):DDL(Data Definition Language) ...

  6. java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

    这里先写几个大家容易搞混的编码设置代码: 在jsp代码中的头部往往有这两行代码 pageEncoding是jsp文件本身的编码contentType的charset是指服务器发送给客户端时的内容编码J ...

  7. 结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程

    1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用, ...

  8. React Native 系列(二) -- React入门知识

    前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...

  9. u盘安装原版win10系统1703更新

    7月底,微软发布了win10的1703更新,听说值得一试,于是,安装ultraISO(下载地址http://pan.baidu.com/s/1dFu48d7 密码: 53cg),下载win10的ISO ...

  10. swift UILabel多行显示时 计算UILable的高度(可用于UILable高度自适应)

    代码如下 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = ...