springboot-intercepter
Spring MVC Intercepter拦截器的使用
- 创建GlobalIntercepter类
- 实现HandlerIntercepter接口
- 重写HandlerIntercepter中的三个方法
/**
* 在业务处理器处理请求之前被调用,预处理,可以进行编码,安全控制,权限校验等处理;
* @param request
* @param response
* @param handler
* @return 是否通过拦截器
* @throws Exception
*/
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
在Spring MVC中配置Intercepter
在SpringMvc.xml配置文件中添加如下代码
<mvc:interceptors>
<mvc:interceptor>
<!-- 此处代表拦截所有请求 -->
<mvc:mapping path="/**"/>
<!-- 此处填写拦截器的全名称 带包名 -->
<bean class="com.xxx.intercepter"/>
</mvc:interceptor>
</mvc:interceptors>
在Spring Boot中 可以这样配置拦截器
新建WebAppConfigurer 并实现WebMvcConfigurer接口
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 可添加多个
registry.addInterceptor(new GlobalIntercepter()).addPathPatterns("/**");
}
.....//此处省略
}
Spring 中过滤器的使用
- 新建GlobalFilter类 并实现Filter接口
- 实现如下三个方法
/**
* 初始化方法,此方法会在服务器启动的时候运行
* @param filterConfig
* @throws ServletException
*/
void init(FilterConfig filterConfig) throws ServletException
/**
*过滤器拦截的业务处理方法
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
/**
* 销毁过滤器时调用
*/
void destroy()
Spring 中Filter的配置
在web.xml中配置
<filter>
<filter-name>{过滤器的名字,随便}</filter-name>
<filter-class>{过滤器在的全类名}</filter-class>
</filter>
<filter-mapping>
<filter-name>{过滤器的名字}</filter-name>
<url-pattern>{要过滤的路径 例如:/*}</url-pattern>
</filter-mapping>
Spring 中拦截器与过滤器的区别
比较内容 | 原理 | 使用 | 应用场景 |
---|---|---|---|
拦截器 Intercepter | 基于java反射机制(动态代理)实现 | 实现HandlerInterceptor接口 实现WebRequestInterceptor接口 |
处理所有请求的共同问题(乱码问题,权限验证问题) |
过滤器 Filter | 基于函数回调来实现 | 实现Filter接口 | 设置字符编码,URL级别的权限访问控制,过滤敏感词汇,压缩响应信息 |
总结
过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大,还能进行资源过滤
拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求
执行顺序
Filter>Servlet>Intercepter>Controller