Spring MVC拦截器是在请求到达处理器前或返回客户端前执行的组件,它可以用于拦截和处理请求,实现一些通用的功能。
Spring MVC拦截器可以实现的功能包括:
- 登录验证:拦截所有请求,检查用户是否已登录,未登录则跳转到登录页面。
- 权限验证:拦截请求,检查用户是否拥有访问权限,没有权限则跳转到错误页面。
- 日志记录:记录请求的参数、处理时间等信息,用于分析和排查问题。
- 数据预处理:对请求参数进行一些预处理,比如格式化日期、转换数据类型等。
- 异常处理:拦截处理过程中出现的异常,进行统一的异常处理。
要使用Spring MVC拦截器,需要实现HandlerInterceptor接口,并注册到Spring的上下文中。拦截器可以通过配置匹配的URL路径、排除的URL路径等条件来决定对哪些请求进行拦截。
拦截器的执行顺序由配置的顺序决定,可以通过实现Ordered接口来指定拦截器的顺序。在拦截器的preHandle方法中,可以根据需要进行请求的拦截或处理;在postHandle方法中可以对处理结果做一些处理;在afterCompletion方法中可以进行一些清理工作。
拦截器是Spring MVC框架提供的一种灵活、可扩展的机制,可以在请求处理的各个阶段进行拦截和处理。它可以帮助我们实现一些通用的功能,代码重用性高,提高了开发效率。
拦截器 SpringMVC
过滤器 javaWeb
拦截器使用:1.创建拦截器类
2.添加拦截器
多个拦截器,先声明的优先级高
public class MyInterceptor implements HandlerInterceptor {//执行handler之前 调用的拦截方法 如登录保护 权限处理等@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("request:"+request+" response:"+response+" handler"+handler);return true;}//执行handler之后 触发的方法 如铭感词汇检查等@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyInterceptor.postHandle");}//整体处理完毕后 触发的方法@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("MyInterceptor.afterCompletion");}
}@Overridepublic void addInterceptors(InterceptorRegistry registry) {//拦截全部请求registry.addInterceptor(new MyInterceptor());}//方案2.指定地址拦截registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/data"); // 模糊地址:/user/* //*代表任意一层 **代表任意多层
在Spring MVC中,我们可以使用JSR 303(Bean Validation)注解来进行参数校验。JSR 303定义了一组标准的注解,可以用于对Java Bean的属性进行验证。
常用的JSR 303注解包括:
@NotNull:表示属性不能为null。
@NotEmpty:表示字符串不能为空,集合不能为空。
@NotBlank:表示字符串不能为空,且长度必须大于0。
@Size:表示属性的大小必须在指定的范围内。
@Min:表示属性的最小值。
@Max:表示属性的最大值。
@Pattern:表示属性必须匹配指定的正则表达式。
@Email:表示属性必须是一个有效的电子邮件地址。
导入依赖
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>8.0.0.Final</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator-annotation-processor</artifactId><version>8.0.0.Final</version></dependency>
步骤:1.在实体类中添加注解
public class User1 {@NotBlankprivate String name; //不为空@Length(min=6)private String password; //长度大于6位@Min(1)private int age; //>=1@Emailprivate String email; //邮箱格式@Pastprivate Date birthday; //过去时间
}
2.handler(@Validated 实体类 实体类对象)
@RestController
@RequestMapping("user1")
public class UserController1 {@PostMapping("register")public Object register(@Validated @RequestBody User1 user1, BindingResult result){//BindingResult 获取错误,绑定错误,不会直接返回if(result.hasErrors()){Map data=new HashMap();data.put("code",400);data.put("msg","参数错误");return data;}return user1;}
}