一. 拦截器
常见的拦截器有登录拦截器,日志拦截器,权限拦截器,异常拦截器,性能拦截器等。
可以与 Struts2的拦截器进行联合性学习。 可以参考老蝴蝶以前写的文章:
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)
SpringMVC实现拦截器,需要实现 org.springframework.web.servlet.HandlerInterceptor 接口。
package org.springframework.web.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract interface HandlerInterceptor { public abstract boolean preHandle(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse, Object paramObject) throws Exception; public abstract void postHandle(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse, Object paramObject, ModelAndView paramModelAndView) throws Exception; public abstract void afterCompletion(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse, Object paramObject, Exception paramException) throws Exception; }
HandlerInterceptor 接口中,有三个方法, preHandler,postHandle,afterCompletion.
1 .preHandler(request,response,obj) 该方法在控制器的处理请求方法之前执行,返回值是boolean, 为true时表示向下执行,为false 时表示中断执行。 通常在这个方法中进行验证拦截。
2 .postHandler(request,response,obj,modelAndView) 该方法在控制器的处理请求方法之后,在解析视图之前执行,可以对请求域 request中的模型和视图进行更一步的修改。
3 .afterCompletion(request,response,obj,exception) 该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。
关于springmvc的配置均采用以前的形式, web.xml 中有字符乱码过滤器, DispatcherServlet 过滤器的url-pattern 设置的是 /, 即采用REST 风格。 springmvc.xml 去掉了 fastjson的配置,保留最开始的。 利用
二. 简单拦截器的配置及执行顺序
二.一 创建登录的拦截器 LoginInterceptor1.java
package com.yjl.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor1 implements HandlerInterceptor{ @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3){ System.out.println("控制器方法执行之后,视图解析器之后执行1"); } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("控制器方法执行之后,视图解析器之前执行1"); } @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("会在控制器方法之前执行1"); return true; } }
二.二 后端代码 UserAction
//转到登录的页面 @RequestMapping(value="toLogin") public String toLogin(Model model){ model.addAttribute("user",new User()); System.out.println("执行toLogin方法"); return "user/login"; } @RequestMapping(value="login") public String login(User user,HttpSession session){ System.out.println("执行Login方法"); if("两个蝴蝶飞".equals(user.getName())&&"1234".equals(user.getPassword())) { session.setAttribute("userLogin", user); return "user/list"; }else{ return "user/login"; } }
二.三 前端代码 login.jsp 设置
<body> <h2>两个蝴蝶飞,拦截器使用</h2> <form:form action="login" commandName="user" type="post"> <form:label path="name">用户名:</form:label> <form:input path="name"/><br/> <form:label path="password">密码:</form:label> <form:input path="password"/><br/> <form:button>提交</form:button> </form:form> </body>
二.四 springmvc.xml 配置拦截器
<mvc:annotation-driven></mvc:annotation-driven> <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!--mvc:mapping 表示拦截的路径, /** 表示全部的路径 --> <mvc:mapping path="/**"/> <bean class="com.yjl.interceptor.LoginInterceptor1"></bean> </mvc:interceptor> </mvc:interceptors>
二.五 重启服务器,进行验证
当输入网址 : http://localhost:8027/SpringMVC09/user/toLogin 进行访问时
控制台打印输出:
在前端输入数据, 用户名和密码 均输入正确的, 即输入 两个蝴蝶飞和 1234,点击提交:
控制台打印输出:
拦截器配置成功。
可知,拦截器的执行顺序是 preHandler–>UserAction中的方法,如 login----->postHandle—> afterCompletion 。
这只是一个拦截器,当多个拦截器,如三个时,又是如何执行的呢?