記錄一下 關於 回話請求上下文注入資料所有 controller 均可接收
阿新 • • 發佈:2020-12-28
需求:需要在攔截器中 認證使用者身份並且把使用者 但是在控制器層需要到使用者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); }
即可獲取到相關資料