问题
在工作中很多时候需要拦截 Http 请求,然后去获取一些参数,这些参数可能是 query string
串,也可能是路由上的字符,对于前者 HandlerInterceptor
的 request 对象有自己的方法,而对于后者,需要我们特殊处理一下,也就是今天要说的内容。
Http请求拦截作用
- 拦截后可以修改请求体
- 拦截后可以作一些其它统一的操作
添加拦截器
地址: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);
}
}