最近在用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要拦截的请求
相关推荐
如果确实需要使用ThreadLocal,务必要在请求结束时正确清理,或者使用其他机制(如HttpSession)来存储这些请求相关的数据。此外,可以考虑使用Spring框架提供的请求范围内的作用域代理,如`@RequestScope`,这将...
public static ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal(); /** * 获取当前线程中的HttpServletRequest对象 * @return 当前线程中的HttpServletRequest对象 */ public ...
`ActionContext`的实例是通过`ThreadLocal`变量`actionContext`管理的,确保每个线程都有自己的ActionContext副本。ThreadLocal确保了ActionContext中的属性只在当前请求线程内可见,这样就避免了线程安全问题。 3...
ThreadLocal是一种线程局部变量,每个线程都有自己的副本,避免了多线程环境下的数据冲突,确保了ActionContext在处理每个请求时都是线程安全的。 此外,ActionContext还提供了一个方便的方法来获取HttpSession: ...
- **ThreadLocal**:使用`ThreadLocal`来保存每个线程的私有数据副本,确保了线程安全。 - **方法解析**: - `set(HttpServletRequest arg0)`:设置`HttpServletRequest`。 - `setSession(HttpSession _session)`...
本章会讲解如何确保Servlet在并发访问时的正确性,包括使用同步机制、避免共享状态,以及使用ThreadLocal等技术来处理线程安全问题。 5. **第5章会话管理**:会话管理是维持用户状态的关键。这章会介绍HttpSession...
HttpSession session = ServletActionContext.getRequest().getSession(); ``` `ServletActionContext`提供了如下几个对象的访问接口: 1. `HttpServletRequest`:HTTP servlet请求对象 2. `HttpServletResponse`:...
ActionContext通过ThreadLocal来实现线程隔离,确保每个线程拥有自己独立的ActionContext副本,这样就保证了线程安全性,避免了多线程环境下可能出现的数据冲突。 **ServletActionContext** ServletActionContext...
- **使用ThreadLocal**:利用`ThreadLocal`类来实现线程隔离,每个线程拥有独立的变量副本,互不影响。 - **同步控制**:在确实需要共享资源的情况下,可以采用同步代码块或`synchronized`关键字等方式进行同步...
- **在请求之间保存 SecurityContext**:通过 ThreadLocal 变量或 HttpSession 来维护 SecurityContext 的状态。 #### 五、访问控制(验证) - **安全和 AOP 建议**:Spring Security 提供了 AOP 支持,可以用来...
1. `SysContext` 类:这个类中定义了一个静态的`ThreadLocal`变量,用于存储`HttpServletRequest`、`HttpServletResponse`和`HttpSession`。`ThreadLocal`是线程局部变量,每个线程都有自己的副本,可以保证在多线程...
4. **线程局部变量**:可以考虑使用ThreadLocal来存储线程相关的数据,避免共享状态导致的线程安全问题。 5. **请求参数的复制**:为了避免线程之间互相影响,通常会将请求参数复制到线程局部变量或者局部方法变量...
- **使用ThreadLocal**:对于需要在不同请求间保持状态的场景,可以通过ThreadLocal来存储临时的状态信息。 #### 二、SpringMVC框架及注解 ##### 2.1 MVC是什么? MVC是一种软件架构模式,它将应用程序分为三个...
- **直接注入**:直接在控制器方法的参数列表中声明 HttpServletRequest 和 HttpSession,SpringMVC 会自动注入这些对象。 #### 12. 获取请求参数: - **参数绑定**:可以直接在控制器方法的参数列表中声明与请求...
例如,避免在Servlet实例中使用成员变量存储请求特定的数据,而是使用局部变量或使用ThreadLocal。 4. **HTTP请求和响应** Servlet通过`HttpServletRequest`和`HttpServletResponse`接口与HTTP协议交互。前者提供...
- 利用Spring提供的ThreadLocal实现线程安全。 **问题十三:为什么要有事物传播行为?** - 为了确保在嵌套事务中正确处理事务边界,避免出现脏读等问题。 **问题十四:介绍一下Spring的事物管理** - **编程式...
在ThreadLocal中保存这些信息,以便于在整个应用程序中使用。为了构造和设置Authentication对象,我们通常需要使用Spring Security在标准身份验证上构建对象的相同方法。 手动触发身份验证 要让我们手动触发身份...