1. 拦截器介绍
拦截器是在servlet执行之前执行的程序(这里就是controller代码执行之前),它主要是用于拦截用户请求并作相应的处理,比如说可以判断用户是否登录,做相关的日志记录,也可以做权限管理。
我的博客后端用拦截器做登录权限拦截
2.自定义拦截器
直接上代码
代码语言:javascript复制public class UserInterceptor implements HandlerInterceptor{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
//编写业务拦截规则
//从sessin中获取用户的信息
blogger blogger = (com.yida.bean.blogger) request.getSession().getAttribute("blogger");
if (blogger==null) {
response.sendRedirect("/admin");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("controller 执行完了");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception { System.out.println("我获取到了一个返回的结果:" response);
System.out.println("请求结束了");
}
}
代码说明:
- 自定义的拦截器可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。
- 重写三个方法,当然也可以只实现一个最重要的preHandle方法。
- preHandle方法:此方法会在进入controller之前执行,返回Boolean值决定是否执行后续操作。
- postHandle方法:此方法将在controller执行之后执行,但是视图还没有解析,可向ModelAndView中添加数据(前后端不分离的)。
- afterCompletion方法:该方法会在整个请求结束(请求结束,但是并未返回结果给客户端)之后执行, 可获取响应数据及异常信息。
3.实现适配器并注册拦截器
代码语言:javascript复制@Configuration //定义此类为配置类,及相当于之前的xml文件
public class InterceptorConfig implements WebMvcConfigurer{
//添加我们的拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
String[] excludePathPatterns = {"/admin","/admin/login"};
WebMvcConfigurer.super.addInterceptors(registry);
//已经提供了拦截器注册类 放进来相当于定义了一个bean
registry.addInterceptor(new UserInterceptor()).addPathPatterns("/admin/**").excludePathPatterns(excludePathPatterns);
}
}
代码说明:
- 需要加上configuration注解说明这是一个配置类,在项目启动的时候自动执行。
- 通过实现WebMvcConfigurer接口可以自定义一个适配器,也可以通过继承WebMvcConfigurerAdapter来定义适配器,建议使用第一种,第二种已经是过时的方法了。
- 重写addInterceptors方法,addInterceptor方法是将拦截器注入到适配器中。
- addPathPatterns方法是设置一个需要拦截的路径,可以是多个字符串或者是直接传入一个数组。
- excludePathPatterns是配置不需要拦截的路径。