SpringMVC拦截器教程

JAVA herman 739浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

接着前面的两篇关于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)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » SpringMVC拦截器教程