动态资源和静态资源
拦截器可以算是aop的一种实现,专门拦截对动态资源的后台请求,也就是拦截对控制层的请求,主要用于判断用户是否有权限请求后台。拦截器不会拦截静态资源,如spring boot默认静态目录resources/static。请求期目录下的html,js,img都不会被拦截。将一些静态资源分离出来放在静态服务器也可以缓解后台服务器的压力。
创建拦截器
package com.david.controller; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor implements HandlerInterceptor { /** * controller执行前调用此方法 * 返回true表示继续执行,返回false终止执行 这里可以加入登陆校验、权限拦截等 */ @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { return false; } /** * controller执行后但未返回视图前调用此方法 * 这里可在返回用户前对模型数据进行加工处理 比如可以加入共用信息以便页面显示 */ @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } /** * controller执行后且试图返回后调用此方法 * 这里可得到执行controller时的异常信息 也可以记录日志 */ @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
只需要实现HandlerInterceptor接口即可,通常在preHandle中判断是否有权限 返回false终止请求(一般重定向到登陆页) 返回true放行
配置拦截器
//回顾下mvc中如何配置 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/product/*"/> <bean class="com.david.utils.myInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
在spring boot中只需要继承WebMvcConfigurerAdapter说明这是一个spring mvc配置类,重写addInterceptors方法就可以实现拦截的配置。
@SpringBootConfiguration public class mvc extends WebMvcConfigurerAdapter { public void addInterceptors(InterceptorRegistry registry) { // addPathPatterns:添加拦截规则 excludePathPatterns: 排除拦截规则 registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/error"); } }
/**表示所有的请求url,包括子路径,/error是spring boot中默认处理异常的url,将其排除掉,不拦截它
使用拦截器还是过滤器
先有的servlet,然后才是spring mvc。同理,首先会执行过滤器,然后才是拦截器。过滤器属于servlet技术,所以可以过滤servlet和spring mvc请求。而拦截器属于spring,所以只能拦截spring mvc,无法拦截servlet,如果项目用的十spring,拦截器可以和spring更好的融合,可以自动识别spring boot静态资源。如果项目没有用spring而是servlet,那肯定只能用过滤器了。