场景:在Web项目中,有一些对象是经常用到的,如Session中的用户、HttpServletRequest等,当然可以通过Spring依赖注入,但是依赖注入不方便的时候,可以通过ThreadLocal存储每一个请求所用到的数据。
- Filter解析Session获得用户和HttpServletRequest
package com.yjy.filter;
import com.yjy.common.RequestHolder;
import com.yjy.model.SysUser;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
public class LoginFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
SysUser sysUser = (SysUser) req.getSession().getAttribute("user");
if (sysUser == null) {
String path = "/signIn.jsp";
resp.sendRedirect(path);
return;
}
RequestHolder.add(sysUser);
RequestHolder.add(req);
filterChain.doFilter(servletRequest, servletResponse);
return;
}
public void destroy() {
}
}
- RequestHolder利用ThreadLocal保存和获取对象
package com.yjy.common;
import com.yjy.model.SysUser;
import javax.servlet.http.HttpServletRequest;
public class RequestHolder {
private static final ThreadLocal<SysUser> userHolder = new ThreadLocal<SysUser>();
private static final ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<HttpServletRequest>();
public static void add(SysUser sysUser) {
userHolder.set(sysUser);
}
public static void add(HttpServletRequest request) {
requestHolder.set(request);
}
public static SysUser getCurrentUser() {
return userHolder.get();
}
public static HttpServletRequest getCurrentRequest() {
return requestHolder.get();
}
public static void remove() {
userHolder.remove();
requestHolder.remove();
}
}
- 获取对象
SysUser sysUser = RequestHolder.getCurrentUser();
HttpServletRequest request = RequestHolder.getCurrentRequest();