如何在实现HandlerInterceptor的类中创建Object以便从任何地方访问该请求

时间:2018-11-20 15:18:45

标签: spring-mvc spring-security

我遇到的情况是:在实现HandlerInterceptor的类的preHandle()方法中,我让sessionId进入传入的HttpServletRequest对象请求。现在使用此会话ID,我正在从数据库中获取userInfo。我必须在服务层等其他地方使用相同的信息来处理请求。

如果你们中有人帮助我实现目标,那将非常有帮助。预先感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用ThreadLocal来存储对用户的引用,该引用只能由当前执行线程访问。

https://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html

您可以将其包装在上下文类中,以便在服务中可以通过静态调用访问当前用户:User user = UserContextUtils.getUser();

UserContextUtils:

public class UserContextUtils {

    private static final ThreadLocal<User> CONTEXT = new ThreadLocal<>();

    public static void setUser(User user) {
        CONTEXT.set(user);
    }

    public static User getUser() {
        return CONTEXT.get();
    }

    public static void clear() {
        CONTEXT.remove();
    }
}

拦截器:

public class MyHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, 
              HttpServletResponse response, Object handler)
            throws Exception {

        User user = null;// get user from the database.
        UserContextUtils.setUser(user);

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, 
             HttpServletResponse response, Object handler,
            Exception ex) {

        // as some web servers re-use threads, you must ensure that the 
        // context is cleared on completion either here or elsewhere.

        UserContextUtils.clear();
    }

    @Override
    public void postHandle(HttpServletRequest request, 
             HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

    }
}