Http請求攔截作用
- 攔截后可以修改請求體
- 攔截后可以作一些其它統一的操作
問題提出
對於很多時間需要攔截很多Http請求,然后去獲取一些參數,這些參數可能是querystring串,也可能是路由上的字符,對於前者HandlerInterceptor的request對象有自己的方法,而對於后者,需要我們特殊處理一下,也就晃今天要說的內容。
添加攔截器
這個在百度上查了很多文章,都說不能實現,而在bing上查了一下馬上找到答案!還是要感謝微軟!
地址:https://stackoverflow.com/questions/12249721/spring-mvc-3-how-to-get-path-variable-in-an-interceptor
/**
* 進行處理器攔截,action之前執行
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
switch (request.getMethod()) {
case "POST":
case "PUT":
case "DELETE":
Map pathVariables = (Map) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
String value = (String) pathVariables.get("code");
YearMonth accountPeriod = YearMonth.parse(request.getParameter("accountPeriod"));
if (value == "1") {
return false;//value為1請求結束
}
break;
default:
break;
}
return true;
}
}
添加注冊組件
注冊組件里可以控制你要攔截的地址,這是很重要的,我們沒必要攔截所有請求!
@Configuration
public class WebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry interceptorRegistry) {
//多個攔截器組成一個攔截器鏈
//addPathPatterns 用於添加攔截規則
//excludePathPatterns用於排除攔截規則
interceptorRegistry.addInterceptor(new ValidateDataInterceptor()).addPathPatterns("/**");
//設置(模糊)匹配的url
// List<String> urlPatterns = Lists.newArrayList();
// urlPatterns.add("/api/v1/goods/*");
// urlPatterns.add("/api/v1/userinfo/*");
super.addInterceptors(interceptorRegistry);
}
}
感謝各位閱讀!