【问题标题】:How to create Object in the class implementing HandlerInterceptor to access it from anywhere for that reqest如何在实现 HandlerInterceptor 的类中创建对象以从任何地方访问它以获取该请求
【发布时间】:2018-11-20 15:18:44
【问题描述】:

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

如果你们中的任何人帮助我实现它,那将非常有帮助。提前致谢。

【问题讨论】:

    标签: spring-mvc spring-security


    【解决方案1】:

    您可以使用 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 {
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2022-01-25
      • 1970-01-01
      • 2014-05-31
      • 2021-09-13
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多