在SpringBoot中我们可以使用HandlerInterceptorAdapter这个适配器来实现自己的拦截器。这样就可以拦截所有的请求并做相应的处理。
在HandlerInterceptorAdapter中主要提供了以下的方法:
- preHandle:在方法被调用前执行。在该方法中可以做类似校验的功能。如果返回true,则继续调用下一个拦截器。如果返回false,则中断执行,也就是说我们想调用的方法不会被执行,但是你可以修改response为你想要的响应。
- postHandle:在方法执行后调用。
-
afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。
下面我们来看如何定义自己的拦截器:
首先配置拦截器:
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ManualInterceptor());
}
}
在这里我们添加拦截器ManualInterceptor,多个拦截器会按照顺序被执行。
定义拦截器:
public class ManualInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}
修改对应的方法为你想要的样子即可。
- request:在该参数中可以获取到和请求相关的信息。比如是否为get请求等。
- response:在该参数中可以获取对象的响应信息。
- handler:该参数中包含了对应方法的信息。比如:方法中的参数类型、参数的注解、方法的注解等信息。
在拦截器中我们还可以设置request的属性值。比如我们定义方法:
@GetMapping(value = "/getAddress")
@ResponseStatus(HttpStatus.OK)
public List<String> getUserAddress(@RequestAttribute("name") String name) {}
在拦截器中我们可以通过handler获取参数中是否有值为name的RequestAttribute注解,有的话则设置name的值:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
MethodParameter[] methodParameters = (HandlerMethod) handler.getMethodParameters();
for (MethodParameter methodParameter : methodParameters) {
RequestAttribute requestAttribute = methodParameter.getParameterAnnotation(RequestAttribute.class);
if (requestAttribute != null && requestAttribute.name().equals("name")) {
request.setAttribute("name", "test");
}
}
return true;
}
这样方法中参数name的值就是我们设置好的test。
版权声明:本文为zhaoruda原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。