目录
browser(浏览器) -> filter(过滤器)->servlet(前端控制器)-> 控制器方法
过滤器是在浏览器和目标资源之间进行过滤
拦截器是在控制器方法前后进行拦截
一、拦截器
SpringMVC 中的拦截器有三个抽象方法:
- preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
- postHandle:控制器方法执行之后执行postHandle()
- afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行afterCompletion()
1.1 springMVC拦截器的简单实现
SpringMVC 中的拦截器用于拦截控制器方法的执行SpringMVC 中的拦截器需要实现 HandlerInterceptorSpringMVC 的拦截器必须在 SpringMVC 的配置文件中进行配置:
<mvc:interceptors>
<!--下面一共有3中方式,使用一个即可-->
<!--1.这种方式,在拦截器的实现类上面不用加组件注解-->
<bean class="com.test.interceptor.FirstInterceptor"></bean>
<!--2.这种方式,可以使用注解来生成拦截器组件,也可以在该配置文件中生成一个bean。通过引用的方式实现-->
<ref bean="firstInterceptor"></ref>
<!-- 以上两种配置方式都是对DispatcherServlet所处理的所有的请求进行拦截 -->
<!--3.第三种方式,推荐-->
<mvc:interceptor>
<!-- path="/*" 代表的不是所有请求,而是上下文路径下的一层请求。要使用path="/**"才能代表所有请求-->
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/testRequestEntity"/>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>
<!--
以上配置方式可以通过ref或bean标签设置拦截器,
通过mvc:mapping设置需要拦截的请求,
通过 mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求
-->
</mvc:interceptors>
编写拦截器实现类,继承HandlerInterceptor接口,重写接口中的默认方法。
@Component
public class FirstInterceptor implements HandlerInterceptor {
/**
* 在控制器方法执行之前执行的方法.返回值为true执行控制器方法,返回值方法为false不执行控制器方法
*
* @param request 请求
* @param response 响应
* @param handler 处理程序
* @return boolean
* @throws Exception 异常
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor --> PreHandle");
return true;
}
/**
* 控制器方法执行之后执行
*
* @param request 请求
* @param response 响应
* @param handler 处理程序
* @param modelAndView 模型和视图
* @throws Exception 异常
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor --> postHandle");
}
/**
* 处理完视图和模型数据,渲染视图完毕之后执行
*
* @param request 请求
* @param response 响应
* @param handler 处理程序
* @param ex 前女友
* @throws Exception 异常
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("FirstInterceptor --> afterCompletion");
}
}
1.2 多个拦截器的执行顺序
1.若每个拦截器的 preHandle() 都返回 true此时多个拦截器的执行顺序和拦截器在 SpringMVC 的配置文件的配置顺序有关:preHandle() 会按照配置的顺序执行,而 postHandle() 和 afterCompletion() 会按照配置的反序执行2.若某个拦截器的 preHandle() 返回了 falsepreHandle() 返回 false 和它之前的拦截器的 preHandle() 都会执行, postHandle() 都不执行,返回 false 的拦截器之前的拦截器的afterCompletion() 会执行
二、过滤器
过滤器是在浏览器和目标资源之间进行过滤
下面就是两个过滤器的配置,主要是对浏览器向服务器资源发送的请求进行某些操作,以满足实际需求。
<!--设置处理请求方式的过滤器,用于处理put和delete请求-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--配置springMVC的编码过滤器-->
<!--解决请求参数传过来中文乱码等问题。注意:springMVC中的编码过滤器要配置在其他过滤器之前,不然会失效-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
本文详细介绍了springMVC中过滤器和拦截器的区别。过滤器在浏览器和目标资源间进行过滤,而拦截器则在控制器方法前后进行拦截。拦截器有preHandle、postHandle和afterCompletion三个阶段,可以控制是否调用控制器方法。同时,文章还探讨了多个拦截器的执行顺序和简单实现。

1035

被折叠的 条评论
为什么被折叠?



