Spring MVC:拦截器

Spring MVC

前言

在 JavaWeb 中,过滤器是 Servlet 技术中最实用的技术,能够管理 Web 服务器的所有 Web 资源,实现信息拦截、权限访问控制、过滤敏感词汇、压缩响应信息等功能。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。

而 Spring MVC 的拦截器类似于过滤器,用来执行预处理和后处理操作。但拦截器是基于 Java 的反射机制(动态代理)实现的,是一个 Spring 组件,由 Spring 容器管理,可以单独使用,并且可以获取 IoC 容器中的 bean 。

拦截器

拦截器可以拦截所有的请求,也可以只拦截满足指定的请求。拦截器一般用来实现以下功能:

  1. 登录验证:在用户访问需要登录的页面之前,拦截器可以检查用户是否已经登录,如果没有登录则重定向到登录页面
  2. 权限检查:在用户访问需要特定权限的页面之前,拦截器可以检查用户是否具有相应的权限,如果没有则返回无权限的错误信息
  3. 日志记录:在用户访问每个页面时,拦截器可以记录日志,包括请求的 IP 地址、请求时间、请求的 URL 等信息
  4. 数据校验:在请求处理之前,拦截器可以校验请求参数的有效性,如果参数不合法则返回错误信息
  5. 统一异常处理:在请求处理出现异常时,拦截器可以统一处理异常信息,避免程序抛出异常页面

简单示例:

首先,创建一个实现 org.springframework.web.servlet.HandlerInterceptor 接口的类

java 复制代码
package cn.edu.springmvcdemo.controller;

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

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

public class HandlerInterceptorDemo implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 执行预处理操作
        System.out.println("Pre-handle");
        return true; // 返回 true 表示继续处理请求,返回 false 则中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 执行后处理操作
        System.out.println("Post-handle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 执行清理操作
        System.out.println("After completion");
    }
}

接着,在 springmvc.xml 配置文件中配置拦截器

xml 复制代码
<!-- 配置拦截器 -->
<mvc:interceptors>
	<!-- 拦截器会拦截所有请求 -->
    <bean class="cn.edu.springmvcdemo.controller.HandlerInterceptorDemo" />
</mvc:interceptors>

最后,测试结果,输入 fileupload

结果如图:

注:配置拦截器的其他方式

1.只拦截指定路径的请求

xml 复制代码
<!-- 配置拦截器 -->
<mvc:interceptors>
    <!-- 1.只拦截指定路径的请求 -->
    <mvc:interceptor>
        <mvc:mapping path="/fileupload" />
        <bean class="cn.edu.springmvcdemo.controller.HandlerInterceptorDemo" />
    </mvc:interceptor>
</mvc:interceptors>

2.排除拦截指定路径的请求

xml 复制代码
<!-- 配置拦截器 -->
<mvc:interceptors>
    <!-- 2.排除拦截指定路径的请求 -->
    <mvc:interceptor>
        <!-- 拦截所有请求,必须在排除拦截的上面 -->
        <mvc:mapping path="/*" />
        <!-- 排除拦截指定路径的请求 -->
        <mvc:exclude-mapping path="/fileupload" />
        <bean class="cn.edu.springmvcdemo.controller.HandlerInterceptorDemo" />
    </mvc:interceptor>
</mvc:interceptors>

附:异常处理

异常处理,指当 Spring MVC 在处理请求过程中出现异常时,通过异常处理器进行处理。异常处理器可以捕获并处理异常,使得程序能够正常运行。

简单示例:

首先,在 springmvc.xml 配置文件中配置异常处理器

xml 复制代码
<!-- 配置全局异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" >
    <!-- 默认异常信息引用名为 exception ,可以修改但要与 error 页面中 ${name} 保持一致 -->
    <property name="exceptionAttribute" value="exception" />
    <property name="exceptionMappings" >
        <props>
            <!-- 跳转到错误页面的名字 -->
            <prop key="java.lang.RuntimeException" >error</prop>
        </props>
    </property>
</bean>

接着,创建一个全局异常处理的页面 error.jsp

html 复制代码
<%--
  Created by IntelliJ IDEA.
  User: dell
  Date: 2023/8/9
  Time: 22:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
    <h3>处理请求过程中出现异常......</h3>
    错误为:${exception}
</body>
</html>

然后,在 controller 类简单写个处理方法

java 复制代码
package cn.edu.springmvcdemo.controller;

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

@Controller
public class ErrorDemo {
    @RequestMapping("/errorTest")
    public String errorTest(@RequestParam("i") int i){
        System.out.println(89/i);
        return "accessing";
    }
}

最后,测试结果

输入 errorTest?i=0(分母不能为零),结果如图:

相关推荐
ssxueyi9 天前
Java 常见Exception异常解决方法
java·开发语言·数据库·异常处理·exception
熬夜加班写代码18 天前
【源码解读】SpringMMVC执行流程
java·后端·程序员·spring mvc
码农爱java22 天前
bash: jstack: command not found【jps、jstack、jmap、jstats 命令不生效解决】
linux·jvm·异常处理·jvm 调优
GGBondlctrl1 个月前
【Spring MVC】关于Spring MVC编程中前后端交互实现简单登录跳转和留言板实例
java·spring mvc·lombok·前后端交互·登录跳转·留言板·接口文档定义
GGBondlctrl1 个月前
【Spring MVC】初步了解Spring MVC的基本概念与如何与浏览器建立连接
java·spring boot·spring mvc·requestmapping·restcontroller
cooldream20091 个月前
使用 Axios 拦截器优化 HTTP 请求与响应的实践
vue·axios·拦截器
图王大胜1 个月前
Android Framework AMS(17)APP 异常Crash处理流程解读
android·app·异常处理·ams·crash·binderdied·讣告
雪碧聊技术1 个月前
Redis6:短信登录
redis·token·拦截器·短信登录
xbronze2 个月前
【笔记】记一次因Spring版本和Tomcat版本不对应,造成Spring MVC项目启动后页面访问报404的问题
tomcat·spring mvc
cyt涛2 个月前
WebMvcConfigurer自定义配置
mvc·自定义·web·配置·拦截器·configurer·消息转换器