• SpringMVC之JSR303和拦截器


    一.什么是JSR303

    二.JSR303

    常用注解

    作用

    使用 导入pom.xml

    在实体类相对应的属性中增加注解用来指定校验 

     在hpjyController里面新加以下代码

     修改eidt.jsp

    测试结果

    ​编辑 

    二.拦截器

     什么是拦截器

     拦截器与过滤器的区别

     应用场景日志记录:拦截器可以用于记录请求的相关信息,如请求的URL、请求参数、请求的处理时间等。通过拦截器记录日志,可以方便后续的系统日志记录和分析,以及对请求的追踪和排查问题。

     使用编写一个OneInterceptor

    在spring-mvc中配置拦截器 

    测试结果

     ​编辑

    编写拦截器链

    编写TwoInterceptor类

    测试结果

    三.用户登录权限控制

    编写LoginInterceptor

      编写LoginController

    编写login.jsp

    编写Spring-Mvc

    测试结果


    一.什么是JSR303

    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将生成相应的错误信息,并将其与视图进行绑定,以便显示给用户。这种验证机制可以帮助开发人员快速、便捷地进行输入数据的验证,提高应用程序的数据质量和安全性。 

    二.JSR303

    常用注解

    JSR 303定义了多个注解来支持对象验证。以下是一些常用的JSR 303注解:

    1. @NotNull:验证字段不能为null。
    2. @NotEmpty:验证字段不能为空,对于String、Collection、Map和数组类型的字段有效。
    3. @NotBlank:验证字段不能为空且长度必须大于0,用于字符串类型的字段。
    4. @Size(min, max):验证字段的大小必须在指定的范围内。
    5. @Min(value):验证字段的值必须大于或等于指定的最小值。
    6. @Max(value):验证字段的值必须小于或等于指定的最大值。
    7. @Pattern(regex):验证字段的值必须符合指定的正则表达式模式。
    8. @Email:验证字段的值必须是有效的电子邮件地址。
    9. @Valid:用于嵌套验证,表示需要对嵌套对象进行验证。

    以上只是一些常见的JSR 303注解,实际上还有其他很多注解可供使用。开发人员可以根据具体的需求选择适合的注解来对对象进行验证。

    作用

    Spring MVC JSR 303的作用是在Spring MVC应用程序中提供一种方便的数据验证机制。它的主要目的是确保输入数据的合法性和一致性,从而提高应用程序的数据质量和安全性。

    通过使用JSR 303规范定义的验证注解,开发人员可以对请求参数、表单数据或任何Java对象进行验证。Spring MVC框架会自动触发验证,并根据验证结果生成相应的错误信息。

    具体来说,Spring MVC JSR 303的作用包括:

    1. 验证请求参数:可以在Controller的方法参数上添加@Valid注解,触发对请求参数的验证。
    2. 验证表单数据:可以在表单对象的字段上使用JSR 303注解,通过校验注解定义的约束条件来验证表单数据的合法性。
    3. 验证任意Java对象:可以对任意Java对象进行验证,通过在对象的字段上添加相应的验证注解来指定验证规则。
    4. 生成错误消息:当验证失败时,Spring MVC会自动将错误信息与视图进行绑定,以方便在页面上显示给用户。
    5. 简化验证逻辑:Spring MVC JSR 303简化了开发人员对输入数据进行验证的逻辑,提供了一种便捷的方式进行数据验证。

    总的来说,Spring MVC JSR 303使数据验证变得简单而便捷,提高了应用程序的健壮性和安全性。

    使用 导入pom.xml
    1. "1.0" encoding="UTF-8"?>
    2. "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. 4.0.0
    5. org.example
    6. xyzy
    7. 1.0-SNAPSHOT
    8. war
    9. xyzy Maven Webapp
    10. http://www.example.com
    11. UTF-8
    12. 1.8
    13. 1.8
    14. 3.7.0
    15. 5.0.2.RELEASE
    16. 3.4.5
    17. 5.1.44
    18. 5.1.2
    19. 1.3.1
    20. 2.1.1
    21. 2.4.3
    22. 2.9.1
    23. 3.2.0
    24. 1.7.13
    25. 4.12
    26. 4.0.0
    27. 1.18.2
    28. 1.1.0
    29. 2.10.0
    30. 2.9.0
    31. 1.7.1.RELEASE
    32. 2.9.3
    33. 1.2
    34. 1.1.2
    35. 8.0.47
    36. 1.3.3
    37. 5.0.2.Final
    38. 1.3.2
    39. org.springframework
    40. spring-core
    41. ${spring.version}
    42. org.springframework
    43. spring-beans
    44. ${spring.version}
    45. org.springframework
    46. spring-context
    47. ${spring.version}
    48. org.springframework
    49. spring-orm
    50. ${spring.version}
    51. org.springframework
    52. spring-tx
    53. ${spring.version}
    54. org.springframework
    55. spring-aspects
    56. ${spring.version}
    57. org.springframework
    58. spring-web
    59. ${spring.version}
    60. org.springframework
    61. spring-test
    62. ${spring.version}
    63. org.mybatis
    64. mybatis
    65. ${mybatis.version}
    66. mysql
    67. mysql-connector-java
    68. ${mysql.version}
    69. com.github.pagehelper
    70. pagehelper
    71. ${pagehelper.version}
    72. org.mybatis
    73. mybatis-spring
    74. ${mybatis.spring.version}
    75. org.springframework
    76. spring-context-support
    77. ${spring.version}
    78. org.mybatis.caches
    79. mybatis-ehcache
    80. ${mybatis.ehcache.version}
    81. net.sf.ehcache
    82. ehcache
    83. ${ehcache.version}
    84. redis.clients
    85. jedis
    86. ${redis.version}
    87. org.springframework.data
    88. spring-data-redis
    89. ${redis.spring.version}
    90. com.fasterxml.jackson.core
    91. jackson-databind
    92. ${jackson.version}
    93. com.fasterxml.jackson.core
    94. jackson-core
    95. ${jackson.version}
    96. com.fasterxml.jackson.core
    97. jackson-annotations
    98. ${jackson.version}
    99. org.apache.commons
    100. commons-dbcp2
    101. ${commons.dbcp2.version}
    102. commons-pool2
    103. org.apache.commons
    104. org.apache.commons
    105. commons-pool2
    106. ${commons.pool2.version}
    107. org.springframework
    108. spring-webmvc
    109. ${spring.version}
    110. org.slf4j
    111. slf4j-api
    112. ${slf4j.version}
    113. org.slf4j
    114. jcl-over-slf4j
    115. ${slf4j.version}
    116. runtime
    117. org.apache.logging.log4j
    118. log4j-api
    119. ${log4j2.version}
    120. org.apache.logging.log4j
    121. log4j-core
    122. ${log4j2.version}
    123. org.apache.logging.log4j
    124. log4j-slf4j-impl
    125. ${log4j2.version}
    126. org.apache.logging.log4j
    127. log4j-web
    128. ${log4j2.version}
    129. runtime
    130. com.lmax
    131. disruptor
    132. ${log4j2.disruptor.version}
    133. junit
    134. junit
    135. ${junit.version}
    136. javax.servlet
    137. javax.servlet-api
    138. ${servlet.version}
    139. provided
    140. org.projectlombok
    141. lombok
    142. ${lombok.version}
    143. provided
    144. jstl
    145. jstl
    146. ${jstl.version}
    147. taglibs
    148. standard
    149. ${standard.version}
    150. org.apache.tomcat
    151. tomcat-jsp-api
    152. ${tomcat-jsp-api.version}
    153. commons-fileupload
    154. commons-fileupload
    155. ${commons-fileupload.version}
    156. org.hibernate
    157. hibernate-validator
    158. ${hibernate-validator.version}
    159. org.apache.shiro
    160. shiro-core
    161. ${shiro.version}
    162. org.apache.shiro
    163. shiro-web
    164. ${shiro.version}
    165. org.apache.shiro
    166. shiro-spring
    167. ${shiro.version}
    168. xyzy
    169. src/main/java
    170. **/*.xml
    171. src/main/resources
    172. *.properties
    173. *.xml
    174. org.apache.maven.plugins
    175. maven-compiler-plugin
    176. ${maven.compiler.plugin.version}
    177. ${maven.compiler.source}
    178. ${maven.compiler.target}
    179. ${project.build.sourceEncoding}
    180. org.mybatis.generator
    181. mybatis-generator-maven-plugin
    182. 1.3.2
    183. mysql
    184. mysql-connector-java
    185. ${mysql.version}
    186. true
    187. maven-clean-plugin
    188. 3.1.0
    189. maven-resources-plugin
    190. 3.0.2
    191. maven-compiler-plugin
    192. 3.8.0
    193. maven-surefire-plugin
    194. 2.22.1
    195. maven-war-plugin
    196. 3.2.2
    197. maven-install-plugin
    198. 2.5.2
    199. maven-deploy-plugin
    200. 2.8.2
    实体类相对应的属性中增加注解用来指定校验 
    1. package com.xy.model;
    2. import lombok.ToString;
    3. import org.hibernate.validator.constraints.NotBlank;
    4. import org.junit.Test;
    5. import javax.validation.constraints.NotNull;
    6. import javax.validation.constraints.Size;
    7. @ToString
    8. public class hpjy {
    9. @NotNull(message = "班级编号不能为空")
    10. // @Size(max = 100,min = 10,message = "大小必须在10至100之间")
    11. protected Integer id;
    12. @NotBlank(message = "班级名不能为空")
    13. protected String name;
    14. @NotBlank(message = "班级教员老师不能为空")
    15. protected String type;
    16. private String image="暂无图片";
    17. public hpjy(Integer id, String name, String type, String image) {
    18. this.id = id;
    19. this.name = name;
    20. this.type = type;
    21. this.image = image;
    22. }
    23. public hpjy() {
    24. super();
    25. }
    26. public Integer getId() {
    27. return id;
    28. }
    29. public void setId(Integer id) {
    30. this.id = id;
    31. }
    32. public String getName() {
    33. return name;
    34. }
    35. public void setName(String name) {
    36. this.name = name;
    37. }
    38. public String getType() {
    39. return type;
    40. }
    41. public void setType(String type) {
    42. this.type = type;
    43. }
    44. public String getImage() {
    45. return image;
    46. }
    47. public void setImage(String image) {
    48. this.image = image;
    49. }
    50. }
     在hpjyController里面新加以下代码
    1. // 给数据添加服务端校验
    2. @RequestMapping("/valiAdd")
    3. public String valiAdd(@Validated hpjy hpjy,
    4. BindingResult result,
    5. HttpServletRequest req){
    6. // 如果服务端验证不通过,有错误
    7. if(result.hasErrors()){
    8. // 服务端验证了实体类的多个属性,多个属性都没有验证通过
    9. List fieldErrors = result.getFieldErrors();
    10. Map map = new HashMap<>();
    11. for (FieldError fieldError : fieldErrors) {
    12. // 将多个属性的验证失败信息输送到控制台
    13. System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());
    14. map.put(fieldError.getField(),fieldError.getDefaultMessage());
    15. }
    16. req.setAttribute("errorMap",map);
    17. }else {
    18. this.hpjyBiz.insertSelective(hpjy);
    19. return "redirect:list";
    20. }
    21. return "hpjy/edit";
    22. }
     修改eidt.jsp
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. Title
    3. 编辑信息

    4. "${pageContext.request.contextPath }/${empty h ? 'hpjy/valiAdd' : 'hpjy/edit'}" method="post">
    5. 枪械编号:"text" name="id" value="${h.id }">"color:red;">${errorMap.id}
    6. 枪械名称:"text" name="name" value="${h.name }">"color:red;">${errorMap.name}
    7. 枪械类型:"text" name="type" value="${h.type }">"color:red;">${errorMap.type}
    8. "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、请求参数、请求的处理时间等。通过拦截器记录日志,可以方便后续的系统日志记录和分析,以及对请求的追踪和排查问题。

    权限验证:拦截器可以用于对用户进行权限验证,判断用户是否具有访问特定资源的权限。例如,在用户访问某个需要登录的页面之前,拦截器可以检查用户是否已登录,并根据用户的角色判断是否有权限访问该页面。

    请求预处理:拦截器可以用于对请求进行预处理,如字符编码转换、请求参数解析、请求数据的封装等。通过拦截器进行预处理,可以减轻目标处理器的负担,提高请求的处理效率和系统的稳定性。

    性能监控:拦截器可以用于监控请求的处理时间,用于系统的性能分析和优化。例如,拦截器可以记录请求的处理时间,并根据时间阈值进行性能告警或者对慢请求进行分析和优化。
     

     使用编写一个OneInterceptor
    1. package com.xy.interceptor;
    2. import org.springframework.web.servlet.HandlerInterceptor;
    3. import org.springframework.web.servlet.ModelAndView;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. public class OneInterceptor implements HandlerInterceptor {
    7. @Override
    8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    9. System.out.println("【OneInterceptor】:preHandle...");
    10. return true;
    11. }
    12. @Override
    13. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    14. System.out.println("【OneInterceptor】:postHandle...");
    15. }
    16. @Override
    17. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    18. System.out.println("【OneInterceptor】:afterCompletion...");
    19. }
    20. }
    在spring-mvc中配置拦截器 
    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:mvc="http://www.springframework.org/schema/mvc"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    10. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    11. package="com.xy"/>
    12. "org.springframework.web.servlet.view.InternalResourceViewResolver">
    13. "viewClass"
    14. value="org.springframework.web.servlet.view.JstlView">
    15. "prefix" value="/WEB-INF/jsp/"/>
    16. "suffix" value=".jsp"/>
    17. "/static/" mapping="/static/**"/>
    18. "multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    19. "defaultEncoding" value="UTF-8">
    20. "maxUploadSize" value="52428800">
    21. "resolveLazily" value="true"/>
    22. "com.xy.interceptor.OneInterceptor">
    测试结果
     

    编写拦截器链
    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:mvc="http://www.springframework.org/schema/mvc"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    10. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    11. package="com.xy"/>
    12. "org.springframework.web.servlet.view.InternalResourceViewResolver">
    13. "viewClass"
    14. value="org.springframework.web.servlet.view.JstlView">
    15. "prefix" value="/WEB-INF/jsp/"/>
    16. "suffix" value=".jsp"/>
    17. "/static/" mapping="/static/**"/>
    18. "multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    19. "defaultEncoding" value="UTF-8">
    20. "maxUploadSize" value="52428800">
    21. "resolveLazily" value="true"/>
    22. "/**"/>
    23. "com.xy.interceptor.OneInterceptor"/>
    24. "/hpjy/**"/>
    25. "com.xy.interceptor.TwoInterceptor"/>
    编写TwoInterceptor类
    1. package com.xy.interceptor;
    2. import org.springframework.web.servlet.HandlerInterceptor;
    3. import org.springframework.web.servlet.ModelAndView;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. public class TwoInterceptor implements HandlerInterceptor {
    7. @Override
    8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    9. System.out.println("【TwoInterceptor】:preHandle...");
    10. return true;
    11. }
    12. @Override
    13. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    14. System.out.println("【TwoInterceptor】:postHandle...");
    15. }
    16. @Override
    17. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    18. System.out.println("【TwoInterceptor】:afterCompletion...");
    19. }
    20. }
    测试结果

    三.用户登录权限控制

    编写LoginInterceptor
    1. package com.xy.interceptor;
    2. import org.springframework.web.servlet.HandlerInterceptor;
    3. import org.springframework.web.servlet.ModelAndView;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. public class LoginInterceptor implements HandlerInterceptor {
    7. @Override
    8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    9. System.out.println("【implements】:preHandle...");
    10. StringBuffer url = request.getRequestURL();
    11. if (url.indexOf("/login") > 0 || url.indexOf("/logout") > 0){
    12. // 如果是 登录、退出 中的一种
    13. return true;
    14. }
    15. // 代表不是登录,也不是退出
    16. // 除了登录、退出,其他操作都需要判断是否 session 登录成功过
    17. String uname = (String) request.getSession().getAttribute("uname");
    18. if (uname == null || "".equals(uname)){
    19. response.sendRedirect("/page/login");
    20. return false;
    21. }
    22. return true;
    23. }
    24. @Override
    25. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    26. }
    27. @Override
    28. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    29. }
    30. }
      编写LoginController
    1. package com.xy.web;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpSession;
    6. /**
    7. * @author bing人
    8. * @site
    9. * @company xy集团
    10. * @create 2023-09-12 14:28
    11. */
    12. @Controller
    13. public class LoginController {
    14. @RequestMapping("/login")
    15. public String login(HttpServletRequest req){
    16. String uname = req.getParameter("uname");
    17. HttpSession session = req.getSession();
    18. if ("zs".equals(uname)){
    19. session.setAttribute("uname",uname);
    20. }
    21. return "redirect:/hpjy/list";
    22. }
    23. @RequestMapping("/logout")
    24. public String logout(HttpServletRequest req){
    25. req.getSession().invalidate();
    26. return "redirect:/hpjy/list";
    27. }
    28. }
    编写login.jsp
    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 30340
    4. Date: 2023/9/12
    5. Time: 14:28
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. Title
    10. 登录界面

    11. "/login" method="post">
    12. 用户:"uname">
    13. "submit">
    编写Spring-Mvc
    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xmlns:mvc="http://www.springframework.org/schema/mvc"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    10. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    11. package="com.xy"/>
    12. "org.springframework.web.servlet.view.InternalResourceViewResolver">
    13. "viewClass"
    14. value="org.springframework.web.servlet.view.JstlView">
    15. "prefix" value="/WEB-INF/jsp/"/>
    16. "suffix" value=".jsp"/>
    17. "/static/" mapping="/static/**"/>
    18. "multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    19. "defaultEncoding" value="UTF-8">
    20. "maxUploadSize" value="52428800">
    21. "resolveLazily" value="true"/>
    22. "com.xy.interceptor.LoginInterceptor">
    测试结果

  • 相关阅读:
    蓝队视角下的防御体系怎样进行突破
    弃用http改用https的缘故,与密钥的使用,证书意义
    达梦数据库定时逻辑备份
    【Linux】linux系统VIM简介_使用
    CICD 流程学习(五)Jenkins后端工程构建
    10 C++设计模式之外观(Facade)模式
    Element-ui
    解密Prompt系列4. 升级Instruction Tuning:Flan/T0/InstructGPT/TKInstruct
    从服务器指定位置下载文件
    ROS 工作空间
  • 原文地址:https://blog.csdn.net/2201_75455485/article/details/132829584