在 JavaWeb 中,过滤器是 Servlet 技术中最实用的技术,能够管理 Web 服务器的所有 Web 资源,实现信息拦截、权限访问控制、过滤敏感词汇、压缩响应信息等功能。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。
而 Spring MVC 的拦截器类似于过滤器,用来执行预处理和后处理操作。但拦截器是基于 Java 的反射机制(动态代理)实现的,是一个 Spring 组件,由 Spring 容器管理,可以单独使用,并且可以获取 IoC 容器中的 bean 。
拦截器可以拦截所有的请求,也可以只拦截满足指定的请求。拦截器一般用来实现以下功能:
简单示例:
首先,创建一个实现 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>
注:配置拦截器的其他方式
1.只拦截指定路径的请求
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/fileupload" />
<bean class="cn.edu.springmvcdemo.controller.HandlerInterceptorDemo" />
mvc:interceptor>
mvc:interceptors>
2.排除拦截指定路径的请求
<mvc:interceptors>
<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" >
<property name="exceptionAttribute" value="exception" />
<property name="exceptionMappings" >
<props>
<prop key="java.lang.RuntimeException" >errorprop>
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";
}
}