我遇到的情况是:在实现HandlerInterceptor的类的preHandle()方法中,我让sessionId进入传入的HttpServletRequest对象请求。现在使用此会话ID,我正在从数据库中获取userInfo。我必须在服务层等其他地方使用相同的信息来处理请求。
如果你们中有人帮助我实现目标,那将非常有帮助。预先感谢。
答案 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 {
}
}