package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
拦截器接口,内部就3个方法
**/
public interface HandlerInterceptor {
/**[调用前] controller执行前调用此方法 返回true表示继续执行,返回false中止执行 这里可以加入登录校验、权限拦截等 **/
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
/**[调用后,但还未渲染视图] controller执行后但未返回视图前调用此方法 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示 **/
void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
/**[调用后,已经渲染视图] controller执行后且视图返回后调用此方法 这里可得到执行controller时的异常信息 这里可记录操作日志,资源清理等 **/
void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
}
好的,那么下面我们尝试写个类来实现它,先把简单的拦截器先用起来。我们再来研究配置,下面增加了一些文件。package com.billstudy.springmvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 自定义拦截器01
* @author Bill
* @since V1.0 2015/02/04
*/
public class MyInterceptor01 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("MyInterceptor01.preHandle()");
return true;<span style="white-space:pre"> </span>// 这里返回true,则请求可以到Controller中
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor01.postHandle()");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("MyInterceptor01.afterCompletion()");
}
}
package com.billstudy.springmvc.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* 通过请求本Controller内部方法,结合拦截器测试效果
* @author Bill
* @since V1.0 2015/02/04
*/
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/demo01")
public ModelAndView demo01(HttpServletRequest request,HttpServletResponse response){
System.out.println("DemoController.demo01()");
ModelAndView result = new ModelAndView("/demo");
result.addObject("msg", "我是萌哒哒的msg");
return result;
}
}
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>demo page</title>
</head>
<body>
msg:${msg}
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd "> <!-- auto scanner class path --> <context:component-scan base-package="com.billstudy.springmvc" /> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/pages" /> <property name="suffix" value=".jsp" /> </bean> <mvc:interceptors> <mvc:interceptor> <!-- path="/user/*.do" /user/所有请求 path="/*/*" 任意两级请求 path="*" 无效 path="/**" 任意请求 --> <mvc:mapping path="/**"/> <bean class="com.billstudy.springmvc.interceptor.MyInterceptor01" /> </mvc:interceptor> </mvc:interceptors> </beans>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="<span style="color:#ff0000;">interceptors</span>"> <list> <bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1" /> <bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2" /> <span style="color:#ff0000;">// ... 可以配置多个,按配置的顺序调用</span> </list> </property> </bean>配置全局的拦截器就是:
<mvc:interceptors> <mvc:interceptor> <!-- path="/user/*.do" /user/所有请求 path="/*/*" 任意两级请求 path="*" 无效 path="/**" 任意请求 --> <mvc:mapping path="/**"/> <bean class="com.billstudy.springmvc.interceptor.MyInterceptor01" /> </mvc:interceptor> <span style="color:#ff0000;"><!-- 这里也可以配置多个 mvc:interceptor 标签 --></span> </mvc:interceptors>
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.billstudy.springmvc.interceptor.MyInterceptor01" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.billstudy.springmvc.interceptor.MyInterceptor02" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.billstudy.springmvc.interceptor.MyInterceptor03" /> </mvc:interceptor> <!-- 这里也可以配置多个 mvc:interceptor 标签 --> </mvc:interceptors>
package com.billstudy.springmvc.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 自定义拦截器02
* @author Bill
* @since V1.0 2015/02/04
*/
public class MyInterceptor02 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("MyInterceptor02.preHandle()");
<strong><span style="color:#cc0000;">return false; // 这里返回false,请求在这里被截断!</span></strong>
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor02.postHandle()");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("MyInterceptor02.afterCompletion()");
}
}
原文地址:http://blog.csdn.net/u010811257/article/details/43492437