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

利用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请求事件,Web服务器接收的每次请求都会通知该监听器。通过配置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>  

时间: 2024-10-02 13:28:29

利用Spring随时随地获得Request和Session的相关文章

What is the best way to handle Invalid CSRF token found in the request when session times out in Spring security

18.5.1 Timeouts One issue is that the expected CSRF token is stored in the HttpSession, so as soon as the HttpSession expires your configured AccessDeniedHandler will receive a InvalidCsrfTokenException. If you are using the default AccessDeniedHandl

tomcat spring 相对路径 request.getContextPath()

问题描述 tomcat spring 相对路径 request.getContextPath() 在spring或者tomcat中 如何设置 可以在jsp程序里面不用加request.getContextPath()也能访问controller 现在是不加request.getContextPath() 程序就报404错误 解决方案 应该不行吧,request.getContextPath()是获得jsp当前上下文路径的. 解决方案二: 使用base标签, <% String path = re

利用spring进行简化测试(JUNIT)

下午复习了一点关于spring简化测试方面的内容,比较感兴趣,就记录下来啦,毕竟记下东西以后可以来看看的,记忆力不总是很好的,但写的东西可以当作复习资料来看看的. 利用spring的mock类进行单元测试:    spring框架提供了大量测试的mock类,包括与jndi,porlet,web应用相关的mock类.尤其是web应用相关的mock类,可以大大提高web组件测试的方便性. 打开spring的下载包的mock文件夹(路径...mock/org/springframework/mock/

利用Spring框架改进J2EE编程

j2ee|编程 摘要 J2EE编程正在变得越来越复杂.J2EE已经发展为一个API.复杂化的编程和配置的复杂网络.为了应对这种复杂性,新的框架和方法不断涌现.这些框架高度依赖于一个称为IoC(Inversion of Control,反向控制)的概念.本文将探讨这种方法的一些特性和优点,因为这种方法与J2EE编程相关,而且可以使J2EE编程变得更轻松. 简介 马克·吐温的一句话常被引用:"--关于我死亡的报道是一种夸张."现在已经出现了很多关于.Net的流言,以及认为J2EE API的

利用 Spring Boot 在 Docker 中运行 Hadoop

本文讲的是利用 Spring Boot 在 Docker 中运行 Hadoop,[编者的话]Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.本文介绍了如何利用Spring Boot在Docker中运行Hadoop任务. 简介 越来越多的应用都开始使用Hadoop框架.而开发者在使用过程中也遇到一些挑战,比如使用诸如Docker之类的容器开发和部署相关的技术栈开发的应用.我们将会在下面的例子中介绍如何克服这些挑战. 由于 S

aop-描述一下怎么利用spring AOP实现权限控制

问题描述 描述一下怎么利用spring AOP实现权限控制 只用描述就可以.不用代码,谢谢啦 解决方案 利用spring aop实现数据源的切换 解决方案二: 简单来说,就是你统一写好权限判断的代码,然后spring会自动在调用你的业务方法之前,执行这段代码,并且根据你的返回决定是否真的执行业务.这样你的权限代码只用在一个地方写一次就可以了. 解决方案三: 权限控制 有两种方式,第一种:自己写个拦截器实现权限控制:第二种使用spring AOP实现权限控制,这个最好采用自定义注解的方式实现,你自

利用 Spring 与 Log4J 巧妙地进行动态日志配置切换并立即生效

引言:    在开发与生产环境中,我们有时候需要对日志的配置进行动态切换,要调试.监控和检查系统的运行时信息.   一般有两种方法    1.通过 Spring 的 Log4jConfigListener 在启动时开启定时器进行定时加载配置文件    2.通过 JMX 动态控制    以上可以从我的<利用Spring来管理控制自己的应用程序>专题演讲资料中获取到更加详细的信息,包括示例的源程序,地址为    http://yulimin.javaeye.com/blog/52354   先说一

做用户登录功能的时候用request还是session

问题描述 做用户登录功能的时候用request还是session 做用户登录功能的时候用request还是session,要做用户个人信息的页面的 解决方案 两个都要用,先用request.getparameter得到用户输入的用户名和密码. 然后判断,如果验证通过,再把用户名放入session 解决方案二: 如果是asp,那么request.getparameter就是request.forms 解决方案三: session 就是关闭浏览器再打开 里面的数据会没掉. 先用request获取输入

利用Spring IOC技术实现用户登录验证机制_java

利用 Spring IOC 技术实现用户登录的验证机制,对用户进行登录验证. 首先利用 Spring 的自动装配模式将 User 对象注入到控制器中,然后将用户输入的用户名和密码与系统中限定的合法用户的用户名和密码进行匹配. 当用户名与密码匹配成功时,跳转到登录成功页面:当用户名与密码不匹配时,跳转到登录失败的页面. 1.创建 User 对象,定义用户名和密码属性,代码如下: package com.importnew; public class User { private String us