博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Spring】使用ThreadLocal获取当前用户的信息
阅读量:2056 次
发布时间:2019-04-28

本文共 3984 字,大约阅读时间需要 13 分钟。

引入:

一提到获取用户信息,大部分人想到的都是通过session来获取用户信息,当要想获取到session,就需要获取对应的request,这样,就会增加代码的耦合性,基于以上缺陷,我们可以使用ThreadLocal来将当前的用户信息存入一个session,需要的时候,直接从全局的ThreadLocal中取出来即可

接下来我们实践操作一波:

创建一个RequestHolder类,定义相关的set和get用户信息的方法

/** * @author evan_qb * @date 2018/8/29 15:09 */public class RequestHolder {    private static final ThreadLocal
userHolder = new ThreadLocal
(); private static final ThreadLocal
requestHolder = new ThreadLocal<>(); 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(); }}

然后定义一个拦截器用于移除对应的ThreadLocal对象,防止内存泄漏

public class HttpInterceptor extends HandlerInterceptorAdapter {    private static final String START_TIME = "requestStartTime";    /**     * 处理前     * @param request     * @param response     * @param handler     * @return     * @throws Exception     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        String url = request.getRequestURI().toString();        Map parameterMap = request.getParameterMap();        log.info("request start url:{},params:{}",url,JsonMapper.object2String(parameterMap));        long startTime = System.currentTimeMillis();        request.setAttribute(START_TIME,startTime);        return true;    }    /**     * 处理后调用(正常)     * @param request     * @param response     * @param handler     * @param modelAndView     * @throws Exception     */    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        /*String url = request.getRequestURI().toString();        Map parameterMap = request.getParameterMap();        log.info("request finish url:{},params:{}",url,JsonMapper.object2String(parameterMap));*/    }    /**     * 处理后调用(任何情况)     * @param request     * @param response     * @param handler     * @param ex     * @throws Exception     */    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        String url = request.getRequestURI().toString();        long start = (long) request.getAttribute(START_TIME);        long end = System.currentTimeMillis();        log.info("request exception url:{},cost:{}ms",url,end - start);        removeThreadLocalInfo();    }    /**     * 移除信息     */    public void removeThreadLocalInfo(){        RequestHolder.remove();    }}

这时,我们需要利用一个过滤器LoginFilter,将每次的请求,和每次的用户信息存入ThreadLocal中

/** * @author evan_qb * @date 2018/8/29 15:29 */public class LoginFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        HttpServletRequest req = (HttpServletRequest) request;        HttpServletResponse resp = (HttpServletResponse) response;        String path = req.getServletPath();        SysUser sysUser = (SysUser) WebUtils.getSessionAttribute(req,"user");        if (sysUser == null){            resp.sendRedirect("/signin.jsp");            return;        }        RequestHolder.add(sysUser);        RequestHolder.add(req);        chain.doFilter(request,response);        return;    }    @Override    public void destroy() {    }}

同时在web.xml中配置好LoginFilter

loginFilter
cn.qblank.filter.LoginFilter
loginFilter
/sys/*
/admin/*

当我们需要用户的信息时,我们可以直接通过RequestHolder的方法直接获取

 

 

你可能感兴趣的文章
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST05~06-----P5~6
查看>>
【托业】toeic托业必背核心词汇_修正版
查看>>
【托业】【新东方托业全真模拟】TEST09~10-----P5~6
查看>>
【托业】新托业全真题库---TEST1
查看>>
【托业】【新东方托业全真模拟】TEST07~08-----P5~6
查看>>
【托业】【跨栏阅读】错题集-REVIEW1
查看>>
【托业】【跨栏】3
查看>>
【托业】【跨栏】REVIEW2
查看>>
【托业】【全真题库】TEST3-语法题+阅读题
查看>>
从json_encode过来的的字符串被返回到html页面时的解析
查看>>
Javascript的RegExp对象(转载自网络)
查看>>
rwx对于文件和目录的意义
查看>>
借助csv用PHP生成excel文件
查看>>
使用SimpleXML解析xml文件数据
查看>>
php读取excel文档内容(转载)
查看>>
vim基本命令(转载自网络)
查看>>
Linux学习(二十二)Shell基础(二)变量、环境变量配置文件
查看>>