Spring MVC中的拦截器案例演示
作者:啊Q老师
前言
在 JavaWeb 中,过滤器是 Servlet 技术中最实用的技术,能够管理 Web 服务器的所有 Web 资源,实现信息拦截、权限访问控制、过滤敏感词汇、压缩响应信息等功能。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。
而 Spring MVC 的拦截器类似于过滤器,用来执行预处理和后处理操作。但拦截器是基于 Java 的反射机制(动态代理)实现的,是一个 Spring 组件,由 Spring 容器管理,可以单独使用,并且可以获取 IoC 容器中的 bean 。
拦截器
拦截器可以拦截所有的请求,也可以只拦截满足指定的请求。拦截器一般用来实现以下功能:
- 登录验证:在用户访问需要登录的页面之前,拦截器可以检查用户是否已经登录,如果没有登录则重定向到登录页面
- 权限检查:在用户访问需要特定权限的页面之前,拦截器可以检查用户是否具有相应的权限,如果没有则返回无权限的错误信息
- 日志记录:在用户访问每个页面时,拦截器可以记录日志,包括请求的 IP 地址、请求时间、请求的 URL 等信息
- 数据校验:在请求处理之前,拦截器可以校验请求参数的有效性,如果参数不合法则返回错误信息
- 统一异常处理:在请求处理出现异常时,拦截器可以统一处理异常信息,避免程序抛出异常页面
简单示例:
首先,创建一个实现 org.springframework.web.servlet.HandlerInterceptor 接口的类
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 配置文件中配置拦截器
<!-- 配置拦截器 --> <mvc:interceptors> <!-- 拦截器会拦截所有请求 --> <bean class="cn.edu.springmvcdemo.controller.HandlerInterceptorDemo" /> </mvc:interceptors>
最后,测试结果,输入 fileupload
结果如图:
注:配置拦截器的其他方式
1.只拦截指定路径的请求
<!-- 配置拦截器 --> <mvc:interceptors> <!-- 1.只拦截指定路径的请求 --> <mvc:interceptor> <mvc:mapping path="/fileupload" /> <bean class="cn.edu.springmvcdemo.controller.HandlerInterceptorDemo" /> </mvc:interceptor> </mvc:interceptors>
2.排除拦截指定路径的请求
<!-- 配置拦截器 --> <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 配置文件中配置异常处理器
<!-- 配置全局异常处理器 --> <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
<%-- 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 类简单写个处理方法
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(分母不能为零),结果如图:
到此这篇关于Spring MVC中的拦截器案例演示的文章就介绍到这了,更多相关Spring MVC拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!