SpringMVC拦截器配置

拦截器顾名思义就是用于拦截访问请求的,我们可以在拦截器里对访问请求进行事先的处理,例如权限检查、记录日志、验证请求数据等等。说白了就是我们可以在请求到控制器之前对其进行一个处理。

拦截器基本上和过滤器是类似的,只不过拦截器提供的方法比较实用,参数也比较多,而且拦截器是受到spring容器的管理的。

实现拦截器很简单,只需要实现spring里的HandlerInterceptor接口并实现接口中的三个方法即可,如下示例:

package org.zero01.test;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("TestInterceptor--拦截器的preHandle方法被执行了");

        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("TestInterceptor--拦截器的postHandle方法被执行了");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("TestInterceptor--拦截器的afterCompletion方法被执行了");
    }
}

注:在springmvc4.x版本中这三个方法都是必须要实现的,而在springmvc5.x版本中则不是必须实现的。

关于这三个方法的执行顺序:

  • preHandle方法在请求到控制器之前被执行,也就是预处理方法,该方法的返回值决定请求是否发送到控制器中,true是发送,类似于filter中的doFilter,false则是中断
  • postHandle方法在控制器之后被执行,此时我们可以通过modelAndView参数对象对模型数据或对视图数据进行处理
  • afterCompletion方法在整个请求处理完毕时执行,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源的清理

完成拦截器的编写后,在Spring配置文件中,装配这个拦截器:

<mvc:interceptors>
    <bean class="org.zero01.test.TestInterceptor"/>
</mvc:interceptors>

然后编写控制器代码如下:

package org.zero01.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

    @RequestMapping("/test/test.do")
    public String test(){
        System.out.println("控制器--test方法被执行了");

        return "index";
    }
}

通过浏览器访问后,控制台打印结果如下:

TestInterceptor--拦截器的preHandle方法被执行了
控制器--test方法被执行了
TestInterceptor--拦截器的postHandle方法被执行了
TestInterceptor--拦截器的afterCompletion方法被执行了

注:拦截器是在DispatcherServlet之后的,如果DispatcherServlet报错的话,拦截器是不会被执行的。

以上是正常的流程,我们来看看中断的流程,把preHandle方法中的返回值改成false,如下:

     ...
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("TestInterceptor--拦截器的preHandle方法被执行了");

        return false;
    }
    ...

通过浏览器访问后,控制台打印结果如下:

TestInterceptor--拦截器的preHandle方法被执行了

从控制台的打印结果中可以看到,请求没有被发送到控制器上,而是在拦截器这里中断了。

springmvc里有个&lt;mvc:mapping/&gt;标签,通过这个标签我们可以配置拦截器只拦截哪些路径下的请求:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/test/**"/>
        <bean class="org.zero01.test.TestInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

如上配置,表示指定拦截器只拦截/test/下的所有请求。如果是其他请求则不会触发拦截器。

除此之外,我们还可以通过&lt;mvc:exclude-mapping/&gt;标签来指定哪个uri的请求不会被拦截器拦截,例如我们指定了拦截器拦截/test/目录下的所有请求,但是我希望访问/test/test.do的请求不被拦截器拦截,则可以使用这个标签进行配置,如下:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/test/**"/>
        <mvc:exclude-mapping path="/test/test.do"/>
        <bean class="org.zero01.test.TestInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

如上配置,表示访问/test/test.do的请求不会触发拦截器。

原文地址:http://blog.51cto.com/zero01/2090702

时间: 2024-11-05 22:01:57

SpringMVC拦截器配置的相关文章

Springboot中SpringMvc拦截器配置与应用(实战)

一.什么是拦截器,及其作用 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对象,允许开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式. 拦截器的使用场景越来越多,尤其是面向切片编程流行之后.那通常拦截器可以做什么呢? 之前我们在Agent介绍中,提到过统计函数的调用耗时.这

SpringMVC 拦截器理解

SpringMVC 配置拦截器 1. 作为拦截器当然是为了拦截 (这不是废话嘛) 那拦截是为了干嘛? 它可以帮我们拦截未登录用户   验证是否登录.设置日志记录.统计一些接口访问量啊 进行统一异常处理  设置一些数据啊 或者计算下应用接口方法执行效率啊 等等   2. 配置拦截器 由于用的是SpringMVC所以要知道 它是有个统一的 DispatcherServlet 控制器, 所以就不用传统的bean方式了,人家给我们提供了其他简单的方式 如下所示:  (我设置了三个方便测试用的) <!--

如何使用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 拦截器