本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
接着前面的两篇关于SpringMVC拦截器的原理和实现机制。本文将进入实战,深入的学习SpringMVC的拦截器。
先来看看SpringMVC拦截器的实现。
package com.xttblog.chapter5.web.interceptor; //省略import public class HandlerInterceptor1 extends HandlerInterceptorAdapter { //此处一般继承HandlerInterceptorAdapter适配器即可 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("===========HandlerInterceptor1 preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("===========HandlerInterceptor1 postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("===========HandlerInterceptor1 afterCompletion"); } }
以上是HandlerInterceptor1实现,HandlerInterceptor2同理 只是输出内容为“HandlerInterceptor2”。
下面是控制器部分。
package com.xttblog.chapter5.web.controller; //省略import public class TestController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception { System.out.println("===========TestController"); return new ModelAndView("test"); } }
Spring配置文件chapter5-servlet.xml
<bean name="/test" class="com.xttblog.chapter5.web.controller.TestController"/> <bean id="handlerInterceptor1" class="com.xttblog.chapter5.web.interceptor.HandlerInterceptor1"/> <bean id="handlerInterceptor2" class="com.xttblog.chapter5.web.interceptor.HandlerInterceptor2"/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="handlerInterceptor1"/> <ref bean="handlerInterceptor2"/> </list> </property> </bean>
interceptors:指定拦截器链,拦截器的执行顺序就是此处添加拦截器的顺序;
视图页面WEB-INF/jsp/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%System.out.println("==========test.jsp");%> test page
在控制台输出 test.jsp
启动服务器测试
输入网址:http://localhost:9080/springmvc-chapter5/test
控制台输出:
===========HandlerInterceptor1 preHandle
===========HandlerInterceptor2 preHandle
===========TestController
===========HandlerInterceptor2 postHandle
===========HandlerInterceptor1 postHandle
==========test.jsp
===========HandlerInterceptor2 afterCompletion
===========HandlerInterceptor1 afterCompletion
到此一个正常流程的演示完毕。和图5-1一样,接下来看一下中断的流程。
中断流程
拦截器
HandlerInterceptor3和HandlerInterceptor4 与 之前的 HandlerInteceptor1和HandlerInterceptor2一样,只是在HandlerInterceptor4的preHandle方法返回false:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("===========HandlerInterceptor1 preHandle"); onse.getWriter().print("break");//流程中断的话需要我们进行响应的处理 return false;//返回false表示流程中断 }
控制器流程中断不会执行到控制器,使用之前的TestController控制器。
Spring配置文件chapter5-servlet.xml
<bean id="handlerInterceptor3" class="com.xttblog.chapter5.web.interceptor.HandlerInterceptor3"/> <bean id="handlerInterceptor4" class="com.xttblog.chapter5.web.interceptor.HandlerInterceptor4"/>
interceptors:指定拦截器链,拦截器的执行顺序就是此处添加拦截器的顺序;
视图页面流程中断,不会执行到视图渲染。
启动服务器测试
输入网址:http://localhost:9080/springmvc-chapter5/test
控制台输出:
===========HandlerInterceptor3 preHandle
===========HandlerInterceptor4 preHandle
===========HandlerInterceptor3 afterCompletion
此处我们可以看到只有HandlerInterceptor3的afterCompletion执行,对应前面的的中断流程的处理流程了。
而且页面上会显示我们在HandlerInterceptor4 preHandle 直接写出的响应“break”。
附上本文完整源代码下载链接:http://pan.baidu.com/s/1i5qrVBv 密码:fo9v
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » SpringMVC拦截器教程