Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。
afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
实现拦截器的两种方式:
通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类来定义
通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。
多个拦截器时,按照 springmvc.xml 配置的顺序执行。
(2个拦截器时) 拦截器1 preHandle 不放行,postHandle 和 afterCompletion 不会执行。
(2个拦截器时) 拦截器1 preHandle 不放行,拦截器2不执行。
多个拦截器时按照 springmvc.xml 配置的顺序执行, preHandle放行 postHandle和afterCompletion反序执行
web的xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>filters</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>Encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filters</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc的xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 开启自动扫描包-->
<context:component-scan base-package="com.zzp.*"></context:component-scan>
<!-- 开启注解-->
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<!-- 注入视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀和后缀-->
<!-- 把你的页面放在什么地方-->
<property name="prefix" value="/"></property>
<!-- 页面的类型-->
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:interceptors>
<!-- 全局拦截器-->
<!-- <bean id="intercepterStudent" class="com.zzp.IntercepterStudent"></bean>-->
<mvc:interceptor>
<!-- 你要拦截的请求-->
<mvc:mapping path="/**"/>
<!-- 不拦截的请求-->
<mvc:exclude-mapping path="/hello"/>
<bean id="intercepterStudent" class="com.zzp.IntercepterStudent"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
拦截器接口的实现
package com.zzp;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class IntercepterStudent implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("请求方法之前!!!");
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
request.getSession().setAttribute("name",name);
request.getSession().setAttribute("pwd",pwd);
if (name.equals("aa")&&pwd.equals("123")){
System.out.println("登陆成功");
return true;
}else {
System.out.println("登陆失败");
response.sendRedirect("index.jsp");
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("请求方法之后,视图渲染之前");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("视图渲染之后");
}
}
package com.zzp.controller;
import com.zzp.entity.Book;
import com.zzp.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
@Controller
public class HelloConroller {
@RequestMapping("/hello")
public ModelAndView hello(HttpServletRequest request) {
System.out.println("hello");
Object name=request.getSession().getAttribute("name");
Object pwd=request.getSession().getAttribute("pwd");
ModelAndView mv = new ModelAndView();
if (name.equals("aa") && pwd.equals("123")) {
System.out.println("登陆成功");
mv.addObject("zzp", "暴龙战士");
mv.setViewName("login");
} else {
System.out.println("登陆失败");
mv.setViewName("index");
}
return mv;
}
}
<html>
<body>
<h2>Hello World!</h2>
<a href="hello">springMVC</a>
<form action="hello" method="post">
<input name="name">
<input name="pwd">
<input type="submit">
</form>
</body>
</html>