SpringMVC拦截器教程

接着前面的两篇关于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

SpringMVC拦截器教程

: » SpringMVC拦截器教程

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/251639.html

(0)
上一篇 2022年5月3日
下一篇 2022年5月3日

相关推荐

发表回复

登录后才能评论