SpringMVC中的拦截器详解及代码示例

下面我来详细讲解“SpringMVC中的拦截器详解及代码示例”的完整攻略。

1. 什么是SpringMVC拦截器

在SpringMVC中,每个请求都由HandlerMapping将请求路由到Controller方法,中间可能会经过多个拦截器。拦截器可以对请求进行预处理和后处理。预处理包括权限判断、实例化一些参数对象等操作,后处理包括修改返回值、输出日志等操作。拦截器类似于Servlet中的过滤器(Filter),但比过滤器功能更加强大。可以在拦截器中访问Spring容器中的Bean,这意味着可以在拦截器中做完复杂的处理后,将处理结果注入到Controller中。

2. SpringMVC拦截器的使用方式

SpringMVC拦截器的使用非常简单,只需要编写一个类实现HandlerInterceptor接口,并重写需要用到的方法即可。主要方法如下:

  • preHandle:在请求处理之前进行调用(Controller方法调用之前);
  • postHandle:在请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后);
  • afterCompletion:在整个请求处理完毕之后被调用,DispatcherServlet 渲染视图后执行。

构建拦截器类的过程如下:

public class MyInterceptor implements HandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      // do something before request handled by Controller
      return true;
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      // do something after Controller called but before returning view
  }

  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      // do something after processing request and rendering view by SpringMVC
  }
}

完成拦截器之后,在SpringMVC配置文件中定义拦截器并指定拦截的url路径即可。

3. SpringMVC拦截器的示例

3.1 计算Controller方法的执行时间

可以使用拦截器计算Controller方法的执行时间,然后将时间添加到日志中。拦截器代码如下:

public class LogInterceptor implements HandlerInterceptor {

  private static final Log logger = LogFactory.getLog(LogInterceptor.class);

  private static final String PASS_TIME = "passTime";

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      // 记录当前时间
      long startTime = System.currentTimeMillis();
      request.setAttribute("startTime", startTime);
      return true;
  }

  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      // 获取开始执行的时间
      long startTime = (long) request.getAttribute("startTime");
      long endTime = System.currentTimeMillis();
      long passTime = endTime - startTime;
      logger.info("request url: " + request.getRequestURI() + ", execute time: " + passTime + "ms");
  }
}

在SpringMVC配置文件中配置拦截器:

<mvc:interceptors>
  <mvc:interceptor>
      <mvc:mapping path="/**"/>
      <bean class="com.example.LogInterceptor"/>
  </mvc:interceptor>
</mvc:interceptors>

3.2. 登录态拦截器

拦截未登录用户请求,使其必须先进行登录操作后才能访问其他请求。拦截器代码如下:

public class LoginInterceptor implements HandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      HttpSession session = request.getSession();
      Object loginUser = session.getAttribute("loginUser");
      if (loginUser == null) {
          response.sendRedirect(request.getContextPath() + "/login");
          return false;
      }
      return true;
  }

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

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

在SpringMVC配置文件中配置拦截器:

<mvc:interceptors>
  <mvc:interceptor>
      <mvc:mapping path="/info/**"/>
      <bean class="com.example.LoginInterceptor"/>
  </mvc:interceptor>
</mvc:interceptors>

/info/**表示拦截/info及其子路径下的请求。

以上就是关于“SpringMVC中的拦截器详解及代码示例”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC中的拦截器详解及代码示例 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 把普通对象转换成json格式的对象的简单实例

    下面是将普通对象转换成JSON格式对象的简单攻略: 准备工作 要将一个普通的对象转换成JSON格式对象,我们需要先引入JSON库(如在浏览器中使用,可以使用内置的JSON对象),然后再使用其中的方法将对象转换成JSON格式对象。 示例1 首先,我们定义一个普通对象: const obj = { name: "张三", age: 18, g…

    Java 2023年5月26日
    00
  • Java语言通过三种方法实现队列的示例代码

    下面是关于“Java语言通过三种方法实现队列”的详细攻略: 一、队列的定义 在计算机科学中,队列是一种特殊的线性数据结构,它只允许在一端进行插入操作,在另一端进行删除操作。在队列中,进行插入操作的一端被称为队尾,进行删除操作的一端被称为队头。 二、常见的队列实现方法 实现队列的方法有很多,其中比较常见的包括: 1、使用数组实现队列 使用数组来实现队列,可以通…

    Java 2023年5月18日
    00
  • 浅谈SpringMVC对RESTfull的支持

    浅谈SpringMVC对RESTful的支持 什么是RESTful RESTful是一种基于HTTP协议的Web服务架构风格,它是一种轻量级、简单易用的架构风格,可以用于构建分布式系统。RESTful架构风格的核心是资源,每个资源都有一个唯一的URI,通过HTTP协议的GET、POST、PUT、DELETE等方法对资源进行操作。 SpringMVC对REST…

    Java 2023年5月17日
    00
  • 已解决:No ‘Access-Control-Allow-Origin’跨域问题

    下面我将详细讲解如何解决 “No ‘Access-Control-Allow-Origin’跨域问题”的完整攻略。 什么是跨域问题? 在浏览器端,当一个网页的代码试图在与当前网页不同的域名、协议、端口上请求数据时,就会引发浏览器的跨域安全机制。比如,网站A在浏览器端试图请求网站B的数据,由于不同源,就会被浏览器拦截。 如何解决跨域问题? 在解决跨域问题时,我…

    Java 2023年6月2日
    00
  • 浅谈Java分布式架构下如何实现分布式锁

    浅谈Java分布式架构下如何实现分布式锁 分布式锁通常用于“共享资源”中,以保证资源的互斥访问。在分布式环境中,由于节点的分散性和网络等因素,保证资源互斥访问变得复杂。因此,需要使用分布式锁实现分布式环境下的资源互斥访问。本篇文章主要介绍Java中如何实现分布式锁。 实现思路 常见的分布式锁实现方式有:ZooKeeper、Redis等。接下来以Redis为例…

    Java 2023年5月27日
    00
  • SpringBoot默认使用HikariDataSource数据源方式

    Spring Boot 是一种在 Spring 框架基础上开发应用程序的快速,便捷的方式。在 Spring Boot 应用程序中,HikariDataSource 是默认的数据源,以提高应用程序的性能。 Spring Boot 框架中默认使用 HikariDataSource 数据源方式,这是因为 HikariCP 是一个高性能的数据库连接池,它具有以下优点…

    Java 2023年5月20日
    00
  • 修改request的parameter的几种方式总结

    让我来为你详细讲解一下“修改request的parameter的几种方式总结”的攻略。 1. 使用@RequestParam注解 @RequestParam 是 Spring MVC 中用于绑定请求参数的注解之一,可以将请求中特定名称的参数绑定到控制器处理方法的参数上。它可以将请求参数转换为指定的 Java 类型,如String、Integer、Boolea…

    Java 2023年5月20日
    00
  • Form表单按回车自动提交表单的实现方法

    当用户在表单中输入完数据并按下回车键时,可以通过JavaScript实现自动提交表单。下面是一些实现方法: 方法1:jQuery实现 如果你正在使用jQuery库,可以使用以下代码实现表单自动提交: $(document).on("keydown", "form input", function (event) { i…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部