利用Spring随时随地获得Request和Session

一、准备工作:

在web.xml中加入

<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>

二、用法:

1、方法一:通过代码实现

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

2、方法二:通过注解实现:

@Autowired
private HttpServletRequest request;


三、关于RequestContextListener的背景知识:
基于LocalThread将HTTP request对象绑定到为该请求提供服务的线程上。这使得具有request和session作用域的bean可以在后面的调用链中被訪问到。 



Request作用域 

<bean id="loginAction" class="com.foo.LoginAction" scope="request"/> 





针对每次HTTP请求。Spring容器会依据loginAction bean定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此能够依据须要放心的更改所建实例的内部状态。而其它请求中依据loginAction
bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。

当处理请求结束,request作用域的bean实例将被销毁。 



Session作用域 

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/> 

针对某个HTTP Session。Spring容器会依据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,你能够依据须要放心的更改所创建实例的内部状态,而别的HTTP
Session中依据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session终于被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

global session作用域 



<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/> 



global session作用域类似于标准的HTTP Session作用域,只是它只在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念。它被全部构成某个portlet web应用的各种不同的portlet所共享。

在global
session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。 



请注意,假如你在编写一个标准的基于Servlet的web应用,而且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,而且不会引起不论什么错误 

二、为什么须要额外的配置RequestContextFilter 

或许会有一个疑问,已经通过ContextLoaderListener(或ContextLoaderServlet)将Web容器与Spring容器整合。为什么这里还要用额外的RequestContextListener以支持Bean的另外3个作用域,原因是ContextLoaderListener实现ServletContextListener监听器接口,而ServletContextListener仅仅负责监听Web容器的启动和关闭的事件。

RequestContextFilter实现ServletRequestListener监听器接口,该监听器监听HTTP请求事件,Webserver接收的每次请求都会通知该监听器。通过配置RequestContextFilter,Spring容器与Web容器结合的更加密切。

三、作用域依赖问题 

假设将Web相关作用域的Bean注入到singleton或prototype的Bean中,这样的情况下。须要Spring AOP

<bean name="car" class="com.demo.Car" scope="request">

<aop:scoped-proxy/>

</bean>

<bean id="boss" class="com.demo.Boss" >

<properrty name="car" ref="car" />

</bean>



[Java][web]利用Spring随时随地获得Request和Session的更多相关文章

  1. 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案

    技术架构在向spring Cloud转型时,一定会有一些年代较久远的项目,代码已变成天书,这时就希望能在不大规模重构的前提下将这些传统应用接入到Spring Cloud架构体系中作为一个服务以供其它项 ...

  2. 传统Java Web(非Spring Boot)、非Java语言项目接入Spring Cloud方案--temp

    技术架构在向spring Cloud转型时,一定会有一些年代较久远的项目,代码已变成天书,这时就希望能在不大规模重构的前提下将这些传统应用接入到Spring Cloud架构体系中作为一个服务以供其它项 ...

  3. Java Web学习总结(6)Cookie/Session

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 二.会话过程中要解决的一些问题 每个用户在使用浏览器与服务器进行 ...

  4. Java Web(三) 会话机制,Cookie和Session详解(转载)

    https://www.cnblogs.com/whgk/p/6422391.html 很大一部分应该知道什么是会话机制,也能说的出几句,我也大概了解一点,但是学了之后几天不用,立马忘的一干二净,原因 ...

  5. 360[警告]跨站脚本攻击漏洞/java web利用Filter防止XSS/Spring MVC防止XSS攻击

    就以这张图片作为开篇和问题引入吧 <options>问题解决办法请参考上一篇 如何获取360站长邀请码,360网站安全站长邀请码 首先360能够提供一个这样平台去检测还是不错的.但是当体检 ...

  6. java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是:         1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...

  7. [Java Web – 3A] – Spring MVC开发注意事项

    1.使用Maven构建项目 2.SpringMVC 绝对路径的问题 首先要明确一点,在html中,资源文件也是有自己的URL,即href中是支持绝对路径.如下代码: <link href=&qu ...

  8. java web项目(spring项目)中集成webservice ,实现对外开放接口

    什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring ...

  9. Java Web开发框架Spring+Hibernate整合效果介绍(附源码)

    最近花了一些时间整合了一个SpringMVC+springAOP+spring security+Hibernate的一套框架,之前只专注于.NET的软件架构设计,并没有接触过Java EE,好在有经 ...

随机推荐

  1. golang sync.Mutex(2)

    package main import ( "fmt" "sync" "time" ) type User struct { Name st ...

  2. qt多线程

    为什么要用多线程? 传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作.如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应.这个问题可以用事 ...

  3. 《三》Java IO 字节输入输出流

    那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream)     ...

  4. canvas和svg区别

    什么是 Canvas? HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像. 画布是一个矩形区域,您可以控制其每一像素. canvas 拥有多种绘制路径.矩形.圆形.字符以 ...

  5. BZOJ3262: 陌上花开(三维偏序,CDQ分治)

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  6. java和javascript日期校验和闰年问题分析和解决方式

    1.闰年的介绍 地球绕太阳执行周期为365天5小时48分46秒(合365.24219天)即一回归年.公历的平年仅仅有365日,比回归年短约0.2422 日,所余下的时间约为四年累计一天.故四年于2月加 ...

  7. Fragment 实现的 分类 效果

    Fragment   实现的 分类 效果 布局文件的信息: <LinearLayout xmlns:android="http://schemas.android.com/apk/re ...

  8. arukas 的 Endpoint

    arukas 的 Endpoint 什么是端点 What is Endpoint arukas.io 的实例几乎每周都自动重新启动,当实例重新启动时,其端口会更改.IP地址和端口的平均寿命是一周,有时 ...

  9. 102.tcp实现多线程连接与群聊

    协议之间的关系 socket在哪 socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP ...

  10. Python 实用第三方库

    1. youtube 视频下载 使用:you-get pip install you-get you-get 'https://www.youtube.com/watch?v=jNQXAC9IVRw'