欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Springmvc拦截器

程序员文章站 2022-07-09 19:07:56
...

Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

拦截器开发步骤:
1、实现接口HandlerInterceptor, 并根据需要选择实现的方法:preHandle、postHandle、afterCompletion
2、在mvc应用上下文中注册自定义的拦截器
一:

public class MyHandlerInterceptor implements HandlerInterceptor {

	//在handler方法执行之前拦截用户的请求 如果返回flase中断后续操作,如果返回true,表示向下继续执行。
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("MyHandlerInterceptor============preHandle");
			return true;
					}
	//在handler请求方法调用之后,解析视图之前执行 可通过此方法对请求域中的model和view进行修改
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
		ModelAndView modelAndView) throws Exception {
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
		//通过request.getParameter() 可获取拦截的数据
		//还可改变数据返回结果如
		if(modelAndView != null) {
		modelAndView.setViewName("success");
		}
		System.out.println("MyHandlerInterceptor========postHandle");
	}
	//在handler方法执行完毕之后(视图渲染结束)可以释放一些资源 记录日志等操作及异常处理
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
		throws Exception {
			HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
			System.out.println("MyHandlerInterceptor==========afterCompletion");
	}

}

二:

	<mvc:annotation-driven>
		 <mvc:message-converters>
		 	<!-- register-defaults="true"表示使用默认的消息转换器 -->
            <!-- FastJson(Spring4.2x以上版本设置) -->
            <!-- 使用@responsebody注解并且返回值类型为String时,返回的string字符串带有双引号"{'user':'songfs'}",其原因是直接将string类型转成了json字符串,应该在json解析器之前添加字符串解析器-->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
            <!-- FastJsonHttpMessageConverter4 使@ResponseBody支持返回Map<String,Object>等类型,它会自动转换为json-->
            <!-- 需要返回json时需要配置 produces = "application/json"。不需要再指定utf-8-->
            <bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <!-- 加入支持的媒体类型 -->
                <property name="supportedMediaTypes">
                    <list>
                        <!-- 这里顺序不能反,一定先写text/html,不然IE执行AJAX时,返回JSON会出现下载文件 -->
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json;charset=UTF-8</value>
                        <value>application/xml;charset=UTF-8</value> 
                    </list>
                </property>
                <property name="fastJsonConfig">
                    <bean class="com.alibaba.fastjson.support.config.FastJsonConfig">
                        <property name="features">
                            <list>
                                <value>AllowArbitraryCommas</value>
                                <value>AllowUnQuotedFieldNames</value>
                                <value>DisableCircularReferenceDetect</value>
                            </list>
                        </property>
                        <property name="dateFormat" value="yyyy-MM-dd HH:mm:ss"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
	</mvc:annotation-driven>
  	<mvc:interceptors>
		<mvc:interceptor>
			<!-- mvc:mapping 中配置需要拦截的路径 -->
			<mvc:mapping path="/**"/>
			
			<!--exclude-mapping 中配置需要剔除拦截的路径 -->
			<mvc:exclude-mapping path="/ws/userWsList"/>
			<bean class="springboot.mvc.Interceptor.MyHandlerInterceptor"></bean>
		</mvc:interceptor>
		
		<mvc:interceptor>
			<!-- mvc:mapping 中配置需要拦截的路径 -->
			<mvc:mapping path="/userInfo/**"/>
			<bean class="springboot.mvc.Interceptor.MySecondInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

mvc:mapping 中配置需要拦截的路径
mvc:exclude-mapping 中配置需要剔除拦截的路径

当同时存在两个拦截器时 各方法执行顺序如下图Springmvc拦截器