对于很多时间需要拦截很多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); } }
感谢各位阅读!