Spring MVC 的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
用户可以自己定义一些拦截器来实现特定的功能。
拦截器链(Interceptor Chain)就是将拦截器按一定的顺序联结成一条链。
在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
拦截器和过滤器的区别:
过滤器是servlet规范中的一部分,任何java web工程都可以使用。
拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
拦截器它是只会拦截访问的控制器方法,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
想自定义拦截器, 要求必须实现:HandlerInterceptor接口
需求:
未登陆状态下点击首页Login
可以登录
如果已经登陆 , 点击login直接跳转到个人中心页面
编写拦截器 实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
/** * 预处理 controller方法执行前执行 * return true 放行 ,执行下一个拦截器, 如果没有, 执行controller中的方法 * return false 不放行, 可以直接跳转到其他页面 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println ("preHandle...."); HttpSession session = request.getSession (); //如果用户名已存在,直接跳转到个人中心页面 if (null!=session.getAttribute ("username")){ request.getRequestDispatcher("/WEB-INF/pages/PersonalCenter.jsp").forward(request, response); return false; } //用户名不存在,用户未登陆, 可以进入登录页面,进行登录 return true; } /** * 后处理方法, controller方法执行后, 跳转到对应页面之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println ("postHandle..."); } @Override public void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println ("afterCompletion.."); } }
控制器代码
@Controller @RequestMapping("/UserControl") public class UserController { //跳转到登录页面 @RequestMapping("/GoLogin") public String GoLogin() throws Exception{ System.out.println ("now begin jump Login page"); return "Login"; } @RequestMapping("/Login") //登录操作 public String Login(User user,HttpSession session){ System.out.println (user); //如果登录成功, 把用户名存进session域对象中 session.setAttribute ("username",user.getUsername ()); //跳转到个人中心 System.out.println ("now begin jump PersonalCenter page"); return "PersonalCenter"; } @RequestMapping("/Logout") public String Logout(HttpSession session) throws Exception{ System.out.println ("Logout...."); //session过期 session.invalidate (); System.out.println ("now begin jump index page"); return "redirect:../index.jsp"; } }
在Spring的配置文件springmvc.xml中 配置拦截器
xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.mkl"/> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> bean>
<mvc:default-servlet-handler/> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/images/" mapping="/images/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:annotation-driven />
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/UserControl/GoLogin"/> <mvc:mapping path="/UserControl/Login"/> <bean class="com.mkl.interceptor.MyInterceptor"/> mvc:interceptor> mvc:interceptors> beans>
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 Applicationdisplay-name>
<filter>
<filter-name>characterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<servlet>
<servlet-name>dispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:springmvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
web-app>