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日

相关文章

  • java读取txt文件并输出结果

    下面是“Java读取txt文件并输出结果”的完整攻略: 1. 读取txt文件 1.1 创建File对象 首先,我们需要创建一个File对象,用来指定要读取的txt文件的路径及文件名。例如,读取名为example.txt的文件,代码如下: File file = new File("example.txt"); 1.2 创建FileRead…

    Java 2023年5月26日
    00
  • 在dos窗口中编译和运行java文件的方法

    在 DOS 窗口编译和运行 Java 文件的方法可以包含以下步骤: 检查 Java 路径:在 DOS 窗口中,输入命令 java -version,检查 Java 是否已经正确安装,以及 Java 的路径是否已经添加到系统环境变量中。 编写 Java 代码:使用文本编辑器,编写 Java 代码,并将其保存为后缀为 .java 的文件,例如 Hello.jav…

    Java 2023年5月23日
    00
  • Spring中的REST分页的实现代码

    下面是关于“Spring中的REST分页的实现代码”的完整攻略,包含两个示例说明。 Spring中的REST分页的实现代码 在Spring中,我们可以使用Spring Data JPA来实现REST分页的功能。Spring Data JPA是Spring Data项目的一部分,它提供了一种简单的方式来访问和操作数据库。本文将详细介绍如何使用Spring Da…

    Java 2023年5月17日
    00
  • Java多线程下解决资源竞争的7种方法详解

    Java多线程下解决资源竞争的7种方法详解,可以分为以下几种: 1. 使用synchronized同步代码块 synchronized关键字可以修饰方法和代码块,保证在同一时间只有一个线程可以执行被synchronized关键字修饰的代码块或方法。使用synchronized关键字的示例代码如下: public synchronized void addCo…

    Java 2023年5月19日
    00
  • ehcache开源缓存框架_动力节点Java学院整理

    EhCache开源缓存框架攻略 什么是EhCache EhCache是一个流行的、开源的缓存框架,它提供了快速、高效、可靠的缓存服务。EhCache的主要特点如下: 支持内存缓存和磁盘缓存 支持LRU、LFU、FIFO等多种缓存清理策略 支持缓存数据的过期时间设置 支持集群下多个应用共享缓存 EhCache使用指南 本节将以Java Spring框架为例,讲…

    Java 2023年5月20日
    00
  • java+mysql实现图书馆管理系统实战

    Java+MySQL实现图书馆管理系统实战攻略 这是一项介绍如何使用Java和MySQL构建图书馆管理系统的攻略。最终的系统将会允许管理员添加、编辑和删除书籍,以及允许用户搜索和借阅图书。 步骤1:设计数据库 第一步是设计数据库。在本例中,我们将设计一个包含两个表的数据库:books 和 users。 books表应至少包含以下列: book_id (int…

    Java 2023年5月24日
    00
  • IDEA快速搭建jsp项目的图文教程

    下面我将为你详细讲解如何通过IDEA快速搭建jsp项目的完整攻略,其中包括了图文教程和示例说明。 第 1 步:创建项目 打开 IntelliJ IDEA 软件; 点击菜单栏“File”-“New”-“Project”; 在弹出的对话框中,选择“Java Enterprise”-“Web Application”; 在下一步中,选择创建项目的位置,填写项目的名…

    Java 2023年6月15日
    00
  • JSP response对象实现文件下载的两种方式

    我会为您详细讲解“JSP response对象实现文件下载的两种方式”的完整攻略。 下载文件是Web开发中非常常见的功能之一。在JSP中,我们可以使用response对象来实现文件下载的功能。具体来说,实现文件下载可以采用两种方式: 1. 使用response的OutputStream方式 使用response的OutputStream方式的基本流程如下: …

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