1. 程式人生 > 實用技巧 >記錄一下 關於 回話請求上下文注入資料所有 controller 均可接收

記錄一下 關於 回話請求上下文注入資料所有 controller 均可接收

需求:需要在攔截器中 認證使用者身份並且把使用者 但是在控制器層需要到使用者Dao的資料時 還得 去操作Dao或者 從session 中取,如果存在web無狀態情況 即無session 時則需要把資料存入當前會話請求的上下文中;

解決方法:

第一步、建立ArgumentResolver 類

public class ArgumentResolver implements WebArgumentResolver {
    @Override
    public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest nativeWebRequest) throws Exception {
        Class<?> parameterType = methodParameter.getParameterType();
        if (parameterType != null){
            HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
            if (parameterType.equals(UserDO.class)){
                // 如果資料物件是 userDO 則直接從 請求上下文中獲取資料返回
                return request.getAttribute("userData");
            }
        }
        // 正常返回 請求資料
        return UNRESOLVED;
    }
}

 第二步、建立攔截器類UserInterceptor

public class UserInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 這裡應該是 取 request.getHeaders 裡面的token 取 userID 然後進行查詢 返回 UserDO
        UserDO userDO = ...;
        //設定返回頁面型別和編碼
        response.setContentType("text/html; charset=UTF-8");
        if (userDO != null){
            request.setAttribute("userData",userDO);
            return true;
        }
        // 認證失敗
        response.sendRedirect(request.getContextPath() + "/passport/login");
        return false;
    }
 }

 第三步、建立配置類

@Configuration
public class WebConfig extends WebMvcConfigurationSupport {


    @Override
    protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new ServletWebArgumentResolverAdapter(new ArgumentResolver()));
        super.addArgumentResolvers(argumentResolvers);
    }
   @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration registration = registry.addInterceptor(new UserInterceptor());
//        registration.excludePathPatterns(
//
//        );
        registration.addPathPatterns(
                "/user/**",
                "/passport/**"
        );
        super.addInterceptors(registry);
    }
}

 第四步、在controller中使用

@GetMapping(value = "/account")
    public String account(
            UserDO userDO
    ){
        System.out.println("userData = " + userDO);
}

  即可獲取到相關資料