`

ThreadLocal 管理 HttpSession

阅读更多

   最近在用spring security控制系统的权限, 在用户登陆的时候,在方法loadUserByUsername里验证用户名是否正确时,想获取HttpSession,并把登陆用户保存到session中,此时发现在当前方法中无法获取HttpSession;类似的,

在系统中,在无法获取HttpSession的时候,想使用session中保存的数据是很困难的;在我们项目中,我们是这样解决的:

 基本思路:创建一个Filter,在请求前把HttpSession绑定到当前线程中,在使用时,从当前线程获取HttpSession

 

1 保存HttpSession的上下文:

 

public class UserContext {
    private static ThreadLocal<HttpSession> tl = new ThreadLocal<HttpSession>();

    public static void setSession(HttpSession session) {
        tl.set(session);
    }

    public static HttpSession getSession() {
        return tl.get();
    }
}

 

2 绑定和注销绑定的Filter

  

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                HttpServletRequest req =(HttpServletRequest) request;
		HttpServletResponse res =(HttpServletResponse) response;
		//当前线程绑定HttpSession
		UserContext.setSession(req.getSession(true));//开启session
		chain.doFilter(request, response);
		UserContext.setSession(null);//取消对session的引用
	}

 

3 在web.xml中配置Filter要拦截的请求

分享到:
评论

相关推荐

    运行在tomcat容器中的ThreadLocal容易产生的问题

    如果确实需要使用ThreadLocal,务必要在请求结束时正确清理,或者使用其他机制(如HttpSession)来存储这些请求相关的数据。此外,可以考虑使用Spring框架提供的请求范围内的作用域代理,如`@RequestScope`,这将...

    普通java类 获取Request

    public static ThreadLocal&lt;HttpServletRequest&gt; requestHolder = new ThreadLocal(); /** * 获取当前线程中的HttpServletRequest对象 * @return 当前线程中的HttpServletRequest对象 */ public ...

    struts2中action如何获取jsp页面参数1.pdf

    `ActionContext`的实例是通过`ThreadLocal`变量`actionContext`管理的,确保每个线程都有自己的ActionContext副本。ThreadLocal确保了ActionContext中的属性只在当前请求线程内可见,这样就避免了线程安全问题。 3...

    ActionContext在struts2.0中的详细应用

    ThreadLocal是一种线程局部变量,每个线程都有自己的副本,避免了多线程环境下的数据冲突,确保了ActionContext在处理每个请求时都是线程安全的。 此外,ActionContext还提供了一个方便的方法来获取HttpSession: ...

    Java自定义过滤器

    - **ThreadLocal**:使用`ThreadLocal`来保存每个线程的私有数据副本,确保了线程安全。 - **方法解析**: - `set(HttpServletRequest arg0)`:设置`HttpServletRequest`。 - `setSession(HttpSession _session)`...

    JavaWeb开发小秘籍

    本章会讲解如何确保Servlet在并发访问时的正确性,包括使用同步机制、避免共享状态,以及使用ThreadLocal等技术来处理线程安全问题。 5. **第5章会话管理**:会话管理是维持用户状态的关键。这章会介绍HttpSession...

    struts2 中action 如何获取jsp 页面参数1.pdf

    HttpSession session = ServletActionContext.getRequest().getSession(); ``` `ServletActionContext`提供了如下几个对象的访问接口: 1. `HttpServletRequest`:HTTP servlet请求对象 2. `HttpServletResponse`:...

    ActionContext介绍(在Struts2中)

    ActionContext通过ThreadLocal来实现线程隔离,确保每个线程拥有自己独立的ActionContext副本,这样就保证了线程安全性,避免了多线程环境下可能出现的数据冲突。 **ServletActionContext** ServletActionContext...

    圣思园 Java web 课件7

    - **使用ThreadLocal**:利用`ThreadLocal`类来实现线程隔离,每个线程拥有独立的变量副本,互不影响。 - **同步控制**:在确实需要共享资源的情况下,可以采用同步代码块或`synchronized`关键字等方式进行同步...

    spring security3 中文版本

    - **在请求之间保存 SecurityContext**:通过 ThreadLocal 变量或 HttpSession 来维护 SecurityContext 的状态。 #### 五、访问控制(验证) - **安全和 AOP 建议**:Spring Security 提供了 AOP 支持,可以用来...

    spring aop 拦截业务方法,实现权限控制示例

    1. `SysContext` 类:这个类中定义了一个静态的`ThreadLocal`变量,用于存储`HttpServletRequest`、`HttpServletResponse`和`HttpSession`。`ThreadLocal`是线程局部变量,每个线程都有自己的副本,可以保证在多线程...

    1工作临时-servlet 多线程问题

    4. **线程局部变量**:可以考虑使用ThreadLocal来存储线程相关的数据,避免共享状态导致的线程安全问题。 5. **请求参数的复制**:为了避免线程之间互相影响,通常会将请求参数复制到线程局部变量或者局部方法变量...

    Spring MVC面试宝典1.pdf

    - **使用ThreadLocal**:对于需要在不同请求间保持状态的场景,可以通过ThreadLocal来存储临时的状态信息。 #### 二、SpringMVC框架及注解 ##### 2.1 MVC是什么? MVC是一种软件架构模式,它将应用程序分为三个...

    SpringMVC面试专题.pdf

    - **直接注入**:直接在控制器方法的参数列表中声明 HttpServletRequest 和 HttpSession,SpringMVC 会自动注入这些对象。 #### 12. 获取请求参数: - **参数绑定**:可以直接在控制器方法的参数列表中声明与请求...

    servlet-practices

    例如,避免在Servlet实例中使用成员变量存储请求特定的数据,而是使用局部变量或使用ThreadLocal。 4. **HTTP请求和响应** Servlet通过`HttpServletRequest`和`HttpServletResponse`接口与HTTP协议交互。前者提供...

    Java面试框架高频问题2019

    - 利用Spring提供的ThreadLocal实现线程安全。 **问题十三:为什么要有事物传播行为?** - 为了确保在嵌套事务中正确处理事务边界,避免出现脏读等问题。 **问题十四:介绍一下Spring的事物管理** - **编程式...

    如何使用Spring Security手动验证用户的方法示例

    在ThreadLocal中保存这些信息,以便于在整个应用程序中使用。为了构造和设置Authentication对象,我们通常需要使用Spring Security在标准身份验证上构建对象的相同方法。 手动触发身份验证 要让我们手动触发身份...

Global site tag (gtag.js) - Google Analytics