应用场景日志记录:拦截器可以用于记录请求的相关信息,如请求的URL、请求参数、请求的处理时间等。通过拦截器记录日志,可以方便后续的系统日志记录和分析,以及对请求的追踪和排查问题。
Spring MVC JSR 303是结合了Spring MVC和JSR 303规范的一种验证机制。Spring MVC是Spring框架的一部分,用于构建基于Java的Web应用程序。而JSR 303是Java中的一个规范,用于定义对象验证的注解和API。
Spring MVC JSR 303提供了一种方便的方式来在Spring MVC应用程序中进行数据验证。通过在Controller的方法参数上添加验证注解,如
@Valid,可以触发对请求参数的验证。该机制能够自动校验请求数据与JSR 303注解中定义的约束条件是否一致,例如非空、长度、范围等。如果验证失败,Spring MVC将生成相应的错误信息,并将其与视图进行绑定,以便显示给用户。这种验证机制可以帮助开发人员快速、便捷地进行输入数据的验证,提高应用程序的数据质量和安全性。
JSR 303定义了多个注解来支持对象验证。以下是一些常用的JSR 303注解:
@NotNull:验证字段不能为null。@NotEmpty:验证字段不能为空,对于String、Collection、Map和数组类型的字段有效。@NotBlank:验证字段不能为空且长度必须大于0,用于字符串类型的字段。@Size(min, max):验证字段的大小必须在指定的范围内。@Min(value):验证字段的值必须大于或等于指定的最小值。@Max(value):验证字段的值必须小于或等于指定的最大值。@Pattern(regex):验证字段的值必须符合指定的正则表达式模式。@Valid:用于嵌套验证,表示需要对嵌套对象进行验证。以上只是一些常见的JSR 303注解,实际上还有其他很多注解可供使用。开发人员可以根据具体的需求选择适合的注解来对对象进行验证。
Spring MVC JSR 303的作用是在Spring MVC应用程序中提供一种方便的数据验证机制。它的主要目的是确保输入数据的合法性和一致性,从而提高应用程序的数据质量和安全性。
通过使用JSR 303规范定义的验证注解,开发人员可以对请求参数、表单数据或任何Java对象进行验证。Spring MVC框架会自动触发验证,并根据验证结果生成相应的错误信息。
具体来说,Spring MVC JSR 303的作用包括:
- 验证请求参数:可以在Controller的方法参数上添加
@Valid注解,触发对请求参数的验证。- 验证表单数据:可以在表单对象的字段上使用JSR 303注解,通过校验注解定义的约束条件来验证表单数据的合法性。
- 验证任意Java对象:可以对任意Java对象进行验证,通过在对象的字段上添加相应的验证注解来指定验证规则。
- 生成错误消息:当验证失败时,Spring MVC会自动将错误信息与视图进行绑定,以方便在页面上显示给用户。
- 简化验证逻辑:Spring MVC JSR 303简化了开发人员对输入数据进行验证的逻辑,提供了一种便捷的方式进行数据验证。
总的来说,Spring MVC JSR 303使数据验证变得简单而便捷,提高了应用程序的健壮性和安全性。
- "1.0" encoding="UTF-8"?>
-
"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
4.0.0 -
-
org.example -
xyzy -
1.0-SNAPSHOT -
war -
-
xyzy Maven Webapp -
-
http://www.example.com -
-
UTF-8 -
1.8 -
1.8 -
3.7.0 -
-
-
5.0.2.RELEASE -
-
3.4.5 -
-
5.1.44 -
-
5.1.2 -
-
1.3.1 -
-
2.1.1 -
2.4.3 -
-
2.9.1 -
3.2.0 -
1.7.13 -
-
4.12 -
4.0.0 -
1.18.2 -
1.1.0 -
2.10.0 -
2.9.0 -
1.7.1.RELEASE -
2.9.3 -
1.2 -
1.1.2 -
8.0.47 -
1.3.3 -
5.0.2.Final -
1.3.2 -
-
-
-
-
org.springframework -
spring-core -
${spring.version} -
-
-
org.springframework -
spring-beans -
${spring.version} -
-
-
org.springframework -
spring-context -
${spring.version} -
-
-
org.springframework -
spring-orm -
${spring.version} -
-
-
org.springframework -
spring-tx -
${spring.version} -
-
-
org.springframework -
spring-aspects -
${spring.version} -
-
-
org.springframework -
spring-web -
${spring.version} -
-
-
org.springframework -
spring-test -
${spring.version} -
-
-
-
org.mybatis -
mybatis -
${mybatis.version} -
-
-
-
mysql -
mysql-connector-java -
${mysql.version} -
-
-
-
com.github.pagehelper -
pagehelper -
${pagehelper.version} -
-
-
-
org.mybatis -
mybatis-spring -
${mybatis.spring.version} -
-
-
org.springframework -
spring-context-support -
${spring.version} -
-
-
-
org.mybatis.caches -
mybatis-ehcache -
${mybatis.ehcache.version} -
-
-
-
net.sf.ehcache -
ehcache -
${ehcache.version} -
-
-
redis.clients -
jedis -
${redis.version} -
-
-
org.springframework.data -
spring-data-redis -
${redis.spring.version} -
-
-
com.fasterxml.jackson.core -
jackson-databind -
${jackson.version} -
-
-
com.fasterxml.jackson.core -
jackson-core -
${jackson.version} -
-
-
com.fasterxml.jackson.core -
jackson-annotations -
${jackson.version} -
-
-
-
org.apache.commons -
commons-dbcp2 -
${commons.dbcp2.version} -
-
-
commons-pool2 -
org.apache.commons -
-
-
-
-
org.apache.commons -
commons-pool2 -
${commons.pool2.version} -
-
-
-
org.springframework -
spring-webmvc -
${spring.version} -
-
-
-
-
-
-
org.slf4j -
slf4j-api -
${slf4j.version} -
-
-
org.slf4j -
jcl-over-slf4j -
${slf4j.version} -
runtime -
-
-
-
org.apache.logging.log4j -
log4j-api -
${log4j2.version} -
-
-
org.apache.logging.log4j -
log4j-core -
${log4j2.version} -
-
-
-
org.apache.logging.log4j -
log4j-slf4j-impl -
${log4j2.version} -
-
-
-
org.apache.logging.log4j -
log4j-web -
${log4j2.version} -
runtime -
-
-
-
com.lmax -
disruptor -
${log4j2.disruptor.version} -
-
-
-
junit -
junit -
${junit.version} -
-
-
javax.servlet -
javax.servlet-api -
${servlet.version} -
provided -
-
-
org.projectlombok -
lombok -
${lombok.version} -
provided -
-
-
jstl -
jstl -
${jstl.version} -
-
-
taglibs -
standard -
${standard.version} -
-
-
org.apache.tomcat -
tomcat-jsp-api -
${tomcat-jsp-api.version} -
-
-
commons-fileupload -
commons-fileupload -
${commons-fileupload.version} -
-
-
org.hibernate -
hibernate-validator -
${hibernate-validator.version} -
-
-
-
org.apache.shiro -
shiro-core -
${shiro.version} -
-
-
org.apache.shiro -
shiro-web -
${shiro.version} -
-
-
org.apache.shiro -
shiro-spring -
${shiro.version} -
-
-
-
xyzy -
-
-
-
src/main/java -
-
**/*.xml -
-
-
-
-
src/main/resources -
-
*.properties -
*.xml -
-
-
-
-
-
org.apache.maven.plugins -
maven-compiler-plugin -
${maven.compiler.plugin.version} -
-
${maven.compiler.source} -
${maven.compiler.target} -
${project.build.sourceEncoding} -
-
-
-
org.mybatis.generator -
mybatis-generator-maven-plugin -
1.3.2 -
-
-
-
mysql -
mysql-connector-java -
${mysql.version} -
-
-
-
true -
-
-
-
maven-clean-plugin -
3.1.0 -
-
-
-
maven-resources-plugin -
3.0.2 -
-
-
maven-compiler-plugin -
3.8.0 -
-
-
maven-surefire-plugin -
2.22.1 -
-
-
maven-war-plugin -
3.2.2 -
-
-
maven-install-plugin -
2.5.2 -
-
-
maven-deploy-plugin -
2.8.2 -
-
-
- package com.xy.model;
-
- import lombok.ToString;
- import org.hibernate.validator.constraints.NotBlank;
- import org.junit.Test;
-
- import javax.validation.constraints.NotNull;
- import javax.validation.constraints.Size;
-
- @ToString
- public class hpjy {
- @NotNull(message = "班级编号不能为空")
- // @Size(max = 100,min = 10,message = "大小必须在10至100之间")
-
- protected Integer id;
-
- @NotBlank(message = "班级名不能为空")
- protected String name;
-
- @NotBlank(message = "班级教员老师不能为空")
- protected String type;
-
- private String image="暂无图片";
-
-
- public hpjy(Integer id, String name, String type, String image) {
- this.id = id;
- this.name = name;
- this.type = type;
- this.image = image;
- }
-
- public hpjy() {
- super();
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- public String getImage() {
- return image;
- }
-
- public void setImage(String image) {
- this.image = image;
- }
- }
- // 给数据添加服务端校验
- @RequestMapping("/valiAdd")
- public String valiAdd(@Validated hpjy hpjy,
- BindingResult result,
- HttpServletRequest req){
- // 如果服务端验证不通过,有错误
- if(result.hasErrors()){
- // 服务端验证了实体类的多个属性,多个属性都没有验证通过
- List
fieldErrors = result.getFieldErrors(); - Map
map = new HashMap<>(); - for (FieldError fieldError : fieldErrors) {
- // 将多个属性的验证失败信息输送到控制台
- System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());
- map.put(fieldError.getField(),fieldError.getDefaultMessage());
- }
- req.setAttribute("errorMap",map);
- }else {
- this.hpjyBiz.insertSelective(hpjy);
- return "redirect:list";
- }
- return "hpjy/edit";
- }
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
Title 编辑信息
- 枪械编号:"text" name="id" value="${h.id }">"color:red;">${errorMap.id}
- 枪械名称:"text" name="name" value="${h.name }">"color:red;">${errorMap.name}
- 枪械类型:"text" name="type" value="${h.type }">"color:red;">${errorMap.type}
- "submit">
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller生命周期之内可以多次调用。
过滤器(filter)
1.filter属于Servlet技术,只要是web工程都可以使用
2.filter主要由于对所有请求过滤
3.filter的执行时机早于Interceptor
拦截器(interceptor)
1.interceptor属于SpringMVC技术,必须要有SpringMVC环境才可以使用
2.interceptor通常由于对处理器Controller进行拦截
3.interceptor只能拦截dispatcherServlet处理的请求
拦截器工作原理
应用场景
日志记录:拦截器可以用于记录请求的相关信息,如请求的URL、请求参数、请求的处理时间等。通过拦截器记录日志,可以方便后续的系统日志记录和分析,以及对请求的追踪和排查问题。权限验证:拦截器可以用于对用户进行权限验证,判断用户是否具有访问特定资源的权限。例如,在用户访问某个需要登录的页面之前,拦截器可以检查用户是否已登录,并根据用户的角色判断是否有权限访问该页面。
请求预处理:拦截器可以用于对请求进行预处理,如字符编码转换、请求参数解析、请求数据的封装等。通过拦截器进行预处理,可以减轻目标处理器的负担,提高请求的处理效率和系统的稳定性。
性能监控:拦截器可以用于监控请求的处理时间,用于系统的性能分析和优化。例如,拦截器可以记录请求的处理时间,并根据时间阈值进行性能告警或者对慢请求进行分析和优化。
- package com.xy.interceptor;
-
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- public class OneInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("【OneInterceptor】:preHandle...");
-
- return true;
- }
-
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- System.out.println("【OneInterceptor】:postHandle...");
-
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- System.out.println("【OneInterceptor】:afterCompletion...");
- }
- }
- "1.0" encoding="UTF-8"?>
"http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
- http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
-
package="com.xy"/> -
-
-
-
-
-
"org.springframework.web.servlet.view.InternalResourceViewResolver"> -
-
"viewClass" - value="org.springframework.web.servlet.view.JstlView">
-
"prefix" value="/WEB-INF/jsp/"/> -
"suffix" value=".jsp"/> -
-
-
-
-
-
"/static/" mapping="/static/**"/> -
-
-
"multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> -
-
"defaultEncoding" value="UTF-8"> -
-
"maxUploadSize" value="52428800"> -
-
"resolveLazily" value="true"/> -
-
-
-
-
"com.xy.interceptor.OneInterceptor"> -
-
-
-


- "1.0" encoding="UTF-8"?>
"http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
- http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
-
package="com.xy"/> -
-
-
-
-
-
"org.springframework.web.servlet.view.InternalResourceViewResolver"> -
-
"viewClass" - value="org.springframework.web.servlet.view.JstlView">
-
"prefix" value="/WEB-INF/jsp/"/> -
"suffix" value=".jsp"/> -
-
-
-
-
-
"/static/" mapping="/static/**"/> -
-
-
"multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> -
-
"defaultEncoding" value="UTF-8"> -
-
"maxUploadSize" value="52428800"> -
-
"resolveLazily" value="true"/> -
-
-
-
-
-
-
-
"/**"/> -
"com.xy.interceptor.OneInterceptor"/> -
-
-
"/hpjy/**"/> -
"com.xy.interceptor.TwoInterceptor"/> -
-
-
-
- package com.xy.interceptor;
-
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- public class TwoInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("【TwoInterceptor】:preHandle...");
-
- return true;
- }
-
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- System.out.println("【TwoInterceptor】:postHandle...");
-
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- System.out.println("【TwoInterceptor】:afterCompletion...");
- }
- }

- package com.xy.interceptor;
-
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- public class LoginInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("【implements】:preHandle...");
- StringBuffer url = request.getRequestURL();
- if (url.indexOf("/login") > 0 || url.indexOf("/logout") > 0){
- // 如果是 登录、退出 中的一种
- return true;
- }
- // 代表不是登录,也不是退出
- // 除了登录、退出,其他操作都需要判断是否 session 登录成功过
- String uname = (String) request.getSession().getAttribute("uname");
- if (uname == null || "".equals(uname)){
- response.sendRedirect("/page/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 {
-
- }
- }
- package com.xy.web;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
-
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
-
- /**
- * @author bing人
- * @site
- * @company xy集团
- * @create 2023-09-12 14:28
- */
- @Controller
- public class LoginController {
- @RequestMapping("/login")
- public String login(HttpServletRequest req){
- String uname = req.getParameter("uname");
- HttpSession session = req.getSession();
- if ("zs".equals(uname)){
- session.setAttribute("uname",uname);
- }
- return "redirect:/hpjy/list";
- }
-
- @RequestMapping("/logout")
- public String logout(HttpServletRequest req){
- req.getSession().invalidate();
- return "redirect:/hpjy/list";
- }
- }
- <%--
- Created by IntelliJ IDEA.
- User: 30340
- Date: 2023/9/12
- Time: 14:28
- To change this template use File | Settings | File Templates.
- --%>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
Title 登录界面
- 用户:"uname">
- "submit">
- "1.0" encoding="UTF-8"?>
"http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
- http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
-
package="com.xy"/> -
-
-
-
-
-
"org.springframework.web.servlet.view.InternalResourceViewResolver"> -
-
"viewClass" - value="org.springframework.web.servlet.view.JstlView">
-
"prefix" value="/WEB-INF/jsp/"/> -
"suffix" value=".jsp"/> -
-
-
-
-
-
"/static/" mapping="/static/**"/> -
-
-
"multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> -
-
"defaultEncoding" value="UTF-8"> -
-
"maxUploadSize" value="52428800"> -
-
"resolveLazily" value="true"/> -
-
-
-
-
"com.xy.interceptor.LoginInterceptor"> -
-
-
-
-
-
-
-
