spring拦截器是aop的一种实现,主要拦截对动态资源的后台请求,也就是拦截对控制层的请求,主要用于判断用户是否有权限请求后台。

动态资源和静态资源

拦截器不会拦截静态资源,如spring boot的默认静态目录resources/static,请求其目录下的html,js,图片等都不会被拦截。因为我们的业务机密数据都在后台,而前端的静态资源可以分离出来放在静态服务器以缓解后台服务器的压力,前后端分离的原因还有很多,本篇不讨论这些。

spring boot 过滤静态资源 springboot静态资源拦截_spring

声明拦截器


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相关配置


拦截器和过滤器


有不少人喜欢把拦截器和过滤器拿来比较,上一篇我讲了过滤器,也解释了先有servlet,然后才是spring mvc。同理,首先会执行过滤器,然后才是拦截器。过滤器属于servlet技术,所以可以过滤servlet和spring mvc的请求。而拦截器属于spring,所以只能拦截spring mvc,无法拦截servlet,具体原因我在上一篇结尾已经讲过。 至于他们的功能有什么区别,哪个更好,并没有必要纠结。如果项目用了spring,拦截器 可以和spring更好的融合,可以自动识别spring boot静态资源。如果项目没有用spring只用了servlet,就肯定用过滤器