1. 程式人生 > >springboot對傳參的攔截統一處理

springboot對傳參的攔截統一處理

在學習某網《java秒殺系統方案優化》的課程中,學到了一種springboot對傳參的攔截統一處理的方式,特記錄一下。

如後臺方法一般需要根據token從Session中獲取User物件,如果不想在每個方法中都新增這段邏輯,而是直接獲取User物件,可以怎麼做呢?

@RequestMapping("/to_list")
public String list(Model model, User user) {...}
第一步:建立一個WebConfig類,實現WebMvcConfigurer介面,重寫public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {..}方法。
第二步:建立一個UserArgumentResolver類,實現HandlerMethodArgumentResolver介面,重寫supportsParameter和resolveArgument方法,這個類主要是對controller層
的方法引數處理。supportsParameter方法表示對什麼引數進行攔截,如需要對User引數進行攔截處理,可以對supportsParameter方法重寫如下:
public boolean supportsParameter(MethodParameter methodParameter) {
Class<?> clazz = methodParameter.getParameterType();
return User.class == clazz;
}
resolveArgument則是具體的組裝User的邏輯,如根據token從redis中獲取User物件,如下:
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, 
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class);
String paramToken = request.getParameter("token");
String cookieToken = getCookieValue(request, "token");
if (StringUtils.isEmpty(paramToken) && StringUtils.isEmpty(cookieToken)) {
return null;
}
String token = StringUtils.isEmpty(paramToken)? cookieToken: paramToken;
return userService.getByToken(response, token);
}
第三步:將上述自定義的引數處理器UserArgumentResolver的bean例項,新增到WebConfig進行處理,如下:

@Autowired
private UserArgumentResolver userArgumentResolver;

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(userArgumentResolver);
}
如上,就可以實現對token到User的統一攔截轉換。
另外,剛開始我用WebConfig繼承WebMvcConfigurationSupport類,發現這樣子的static下的靜態資源無法載入,然後找到了WebMvcAutoConfiguration這springboot下的類,有個註解
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class}),大致可以理解為這個webmvc自動配置類必須要在沒有WebMvcConfigurationSupport的例項的時候生效。因此繼承了
WebMvcConfigurationSupport,導致預設配置失效,這也就解釋了為什麼js、css等靜態資源無法載入問題。