spring拦截器是aop的一种实现,主要拦截对动态资源的后台请求,也就是拦截对控制层的请求,主要用于判断用户是否有权限请求后台。
动态资源和静态资源
拦截器不会拦截静态资源,如spring boot的默认静态目录resources/static,请求其目录下的html,js,图片等都不会被拦截。因为我们的业务机密数据都在后台,而前端的静态资源可以分离出来放在静态服务器以缓解后台服务器的压力,前后端分离的原因还有很多,本篇不讨论这些。
声明拦截器
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException{
//如果session参数不为空,说明已经登录,拥有权限,返回true继续访问。
if(request.getSession().getAttribute("session参数")!=null){
return true;
}
//如果session参数为空,说明没有登录,返回false,可配置重定向跳转到登录页面
response.sendRedirect("/login.html");
return false;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView){
System.out.println("在请求不报异常,顺利完成后执行");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
System.out.println("无论请求是否异常,最后都会执行。用于清理资源,关闭连接等");
}
}
只需要实现HandlerInterceptor接口即可,三个方法中只有preHandle方法有返回值,通常就是在这个方法中检查用户的session,判断其是否有权限
配置拦截器
@SpringBootConfiguration
public class Mvc extends WebMvcConfigurerAdapter {
public void addInterceptors(InterceptorRegistry registry) {
//在系统中添加 拦截器
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/error");
}
}
addPathPatterns:添加拦截规则,/**表示所有的请求url,包括子路径。
excludePathPatterns: 排除拦截规则,/error是spring boot中的默认处理异常的url,所以排除掉,不拦截它。
继承WebMvcConfigurerAdapter说明这是一个spring mvc配置类,重写addInterceptors方法就可以实现拦截器的配置。
可以查看
WebMvcConfigurerAdapter源码,在这里重写其他方法可以
实现其他的
mvc相关配置