SpringMVC 拦截器理解

SpringMVC 配置拦截器

1. 作为拦截器当然是为了拦截 (这不是废话嘛) 那拦截是为了干嘛?

它可以帮我们拦截未登录用户   验证是否登录、设置日志记录、统计一些接口访问量啊

进行统一异常处理  设置一些数据啊 或者计算下应用接口方法执行效率啊 等等

  2. 配置拦截器

由于用的是SpringMVC所以要知道 它是有个统一的 DispatcherServlet 控制器,

所以就不用传统的bean方式了,人家给我们提供了其他简单的方式

如下所示:  (我设置了三个方便测试用的)

<!--拦截器 -->

<mvc:interceptors>

<!--多个拦截器,顺序执行 -->

<mvc:interceptor>

<mvc:mapping path="/**" />

<!-- 表示拦截所有的url,包括子url路径 -->

<bean class="com.tz.interceptor.LoginHandlerInterceptor"></bean>

</mvc:interceptor>

<mvc:interceptor>

<mvc:mapping path="/**" />

<bean class="com.tz.interceptor.LoginHandlerInterceptor2"></bean>

</mvc:interceptor>

<mvc:interceptor>

<mvc:mapping path="/**" />

<bean class="com.tz.interceptor.LoginHandlerInterceptor3"></bean>

</mvc:interceptor>

</mvc:interceptors>

         SpringMVC 拦截器需要实现 HandlerInterceptor 接口,它有三个方法:

(1) preHandle方法 

该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,

可以同时存在,多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的

执行,而且所有的Interceptor中的preHandle方法都会在 Controller方法调用之前调用。

SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令                                  preHandle的返回值为false,当preHandle的返回值为false的时候整个请求就结束了。


            (2) postHandle 方法

这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行

postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之后,

也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的

渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操作,

这个方法的链式结构跟正常访问的方向是相反的,

也就是说先声明的Interceptor拦截器该方法反而会后调用,(这句话等下你就会明白了)

这跟Struts2里面的拦截器的执行过程有点像,

只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法

Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor

或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,

要在Interceptor之后调用的内容都写在调用invoke方法之后

(3) afterCompletion方法

请求完成后调用,这时把你要做什么事写上去,比如 清理资源

那么建立的拦截器类:  其他两个都一样

public class LoginHandlerInterceptor implements HandlerInterceptor {

/***

*  请求传送到接口之前调用该方法,如true通过则进入接口请求数据

*/

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

System.out.println("LoginHandlerInterceptor ------ preHandle");

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView)     throws Exception {

System.out.println("LoginHandlerInterceptor ------ postHandle");

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  throws Exception {

System.out.println("LoginHandlerInterceptor ------ afterCompletion");

}

}

3.那么多个拦截器的执行过程又是如何的?

第二个拦截器不通过的  结果:

LoginHandlerInterceptor ----------preHandle

LoginHandlerInterceptor2 ------ preHandle

LoginHandlerInterceptor ----------afterCompletion

也就是说第二个拦截器不会执行他自己之后的两个方法和postHandle() 方法 ,以及之后的拦截器

第三个拦截器不通过的  结果:

LoginHandlerInterceptor ----------preHandle

LoginHandlerInterceptor2 ------ preHandle

LoginHandlerInterceptor3 ------------ preHandle

LoginHandlerInterceptor2 ------ afterCompletion

LoginHandlerInterceptor ----------afterCompletion

也就是说第三个拦截器不会执行他自己之后的两个方法和postHandle() 方法 ,以及之后的拦截器

当3个拦截器都通过执行时:

LoginHandlerInterceptor ----------preHandle

LoginHandlerInterceptor2 ------ preHandle

LoginHandlerInterceptor3 ------------ preHandle

LoginHandlerInterceptor3 ---------- postHandle

LoginHandlerInterceptor2 ------ postHandle

LoginHandlerInterceptor ---------- postHandle

LoginHandlerInterceptor3  ---------- afterCompletion

LoginHandlerInterceptor2 ------ afterCompletion

LoginHandlerInterceptor ---------- afterCompletion

总结下:


所以是执行通过了所有的PreHandle()方法之后 才会执行 postHandle() 方法;

preHandle() 方法如果通过了 则执行下一个preHandle(), 不通过则不执行;

然后执行 通过 preHandle() 方法的拦截器的 afterCompletion() 方法

我随性写了个登录拦截器 大神勿喷

public class LoginHandlerInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

//获取请求的url

String url = request.getRequestURI();

System.out.println("LoginHandlerInterceptor ----------preHandle");

//判断url是否是公开地址,实际使用时应该将公开地址配置在配置文件中,这里公开地址是登录提交的地址

if(url.indexOf("login") >= 0){

//如果是登录提交,则放行

return true;

}

HttpSession session = request.getSession();

//从session中取出用于身份信息

String username = (String) session.getAttribute("tzUserName");

if(username != null){

//身份信息验证通过,放行

return true;

}

//没有校验通过,表示用户身份需要认证,此时需要跳转到登录页面

request.getRequestDispatcher("/views/login.jsp").forward(request, response);

//返回false表示拦截,不向下执行

return false;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

System.out.println("LoginHandlerInterceptor ----------postHandle");

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

System.out.println("LoginHandlerInterceptor ----------afterCompletion");

}

时间: 2024-10-12 16:03:04

SpringMVC 拦截器理解的相关文章

springmvc拦截器使用和原理理解

与struts2类似,springmvc的拦截器主要作用也是在服务端真正处理请求前后进行一些相关的操作. 例如初始化资源,权限监控,会话设置,菜单获取,资源清理等. 步骤: 1. 定义拦截器 自定义拦截器一般继承自HandlerInterceptorAdapter 或者实现 HandlerInterceptor 接口. 实现接口需要实现对应的3中方法,继承父类只需要实现需要的方法即可.preHandle,postHandle,afterCompletion public class MyInte

如何使用SpringMVC拦截器

如何使用SpringMVC拦截器 自定义一个拦截器,要实现HandlerInterceptor接口: public class MyInteceptor implements HandlerInterceptor { 略... } Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截. Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器. 当一个请求按Order值从小到

SpringMVC拦截器(实现登录验证拦截器)

本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 St

SpringMVC拦截器+Spring自定义注解实现权限验证

设计思路 主要针对需要登录后操作的接口进行校验.接入层在对外暴露接口后,网页.APP.第三方等等途径进行访问接口.用户请求首先会被SpringMVC拦截器拦截到,在拦截器里第一步就是需要校验用户的登录身份(由于是分布式系统这里采用的是userId+accessToken方式来校验),登录校验通过之后再进行用户权限校验,此时会自动拦截@AuthValidate注解的method(核心),如果权限校验失败则抛出权限不足异常,否则校验通过之后再执行具体接口并返回结果. 1.自定义注解 1 packag

SpringMVC拦截器的使用

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间. 一.springMVC拦截器的实现方式 springMVC拦截器的实现一般有两种方式:第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口.第二种方式是继承实现了HandlerInterceptor接口的类,比

SpringMVC拦截器详解[附带源码分析]

目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 拦截器是每个Web框架必备的功能,也是个老生常谈的主题了. 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理. 重要接口及类介绍 1. Hand

SpringMVC拦截器(资源和权限管理)-login拦截

SpringMVC拦截器(资源和权限管理) 1.自定义拦截器 SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法.preHandle在业务处理器处理请求之前被调用,    postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 .所以要想实现自己的权限管理逻辑,

SpringMVC拦截器_1_拦截器的实现

SpringMVC interceptor:下列参考的blog文章 Spring MVC简介 SpringMVC 拦截器实现原理和登录实现 SpringMVC拦截器详解[附带源码分析] 学习SpringMVC--拦截器 ********************* 1-1 拦截器 拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强. 使用场景:解决请求的共性问题(如:乱码问题,权限验证等) ===2 拦截器的实现========================== ---2-1 拦截器

SpringMVC拦截器2(资源和权限管理)(作为补充说明)

SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet.    DispatcherServlet是前置控制器,配置在web.xml文件中的.拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理.  所以我们现在web.xml中加入以下配置: [html] view plain co