• SpringMVC-----JSR303以及拦截器


    目录

    JSR303

    什么是JSR303

    JSR303的作用

    JSR303常用注解 

    入门使用 

     拦截器是什么

     拦截器的工作原理

    拦截器的作用

    拦截器的使用


    JSR303

    什么是JSR303

    JSR303是Java为Bean数据合法性校验提供给的标准框架,已经包含在JavaEE6.0中1。

    JSR303通过在Bean属性中标注类似@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证1。JSR303的参考实现是HibernateValidator,除了支持所有标准的校验注解外,HibernateValidator还具有JSR-380的实现12。

    JSR303的作用

    JSR303是Java为Bean数据合法性校验提供给的标准框架,其主要作用是提供一种可插拔的验证机制,用于在Java EE和Java SE环境中对Java Bean进行数据校验12。

    JSR303通过在Bean属性中标注标准的注解来指定校验规则,并通过验证接口对Bean进行验证。其参考实现是HibernateValidator,除了支持所有标准的校验注解外,HibernateValidator还具有JSR-380的实现12。

    JSR303常用注解 

    入门使用 

    导入依赖

    1. <!-- JSR303 -->
    2. <hibernate.validator.version>6.0.7.Final</hibernate.validator.version>
    3. <!-- JSR303 -->
    4. <dependency>
    5. <groupId>org.hibernate</groupId>
    6. <artifactId>hibernate-validator</artifactId>
    7. <version>${hibernate.validator.version}</version>
    8. </dependency>

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

    1. @NotNull(message = "班级编号不能为空")
    2. // @Size(max = 100,min = 10,message = "大小必须在10至100之间")
    3. protected Integer book_id;
    4. @NotBlank(message = "班级名不能为空")
    5. protected String book_name;
    6. @NotBlank(message = "班级教员老师不能为空")
    7. protected Float price;
    8. private String image="暂无图片";

    增加以下方法

    1. @RequestMapping("/valiAdd")
    2. public String valiAdd(@Validated Bookxx bookxx,
    3. BindingResult result,
    4. HttpServletRequest req){
    5. // 如果服务端验证不通过,有错误
    6. if(result.hasErrors()){
    7. // 服务端验证了实体类的多个属性,多个属性都没有验证通过
    8. List<FieldError> fieldErrors = result.getFieldErrors();
    9. Map<String,Object> map = new HashMap<>();
    10. for (FieldError fieldError : fieldErrors) {
    11. // 将多个属性的验证失败信息输送到控制台
    12. System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());
    13. map.put(fieldError.getField(),fieldError.getDefaultMessage());
    14. }
    15. req.setAttribute("errorMap",map);
    16. }else {
    17. this.bookxxBiz.insertSelective(bookxx);
    18. return "redirect:list";
    19. }
    20. return "clz/edit";
    21. }

     在我们的编辑页面修改一下代码

    1. <h1>编辑界面</h1>
    2. <form action="${pageContext.request.contextPath }/clz/${empty book?'valiAdd' : 'edit'}" method="post">
    3. 书籍编号:<input type="text" name="book_id" value="${book.book_id }"><span style="color: red;">${errorMap.book_id}</span><br>
    4. 书籍名字:<input type="text" name="book_name" value="${book.book_name }"><span style="color: red;">${errorMap.book_name}</span><br>
    5. 价格:<input type="text" name="price" value="${book.price }"><span style="color: red;">${errorMap.price}</span><br>
    6. <input type="submit">
    7. </form>

     测试

     拦截器是什么

    拦截器(Interceptor)是一种设计模式,主要用于在方法调用之前、之后或异常抛出时执行一些额外的逻辑操作。拦截器可以用于实现一些公共的横切关注点,例如日志记录、性能监测、事务管理等。

    在Java开发框架中,如Spring框架,拦截器是常见的组件,用于在请求处理的不同阶段进行拦截和处理。主要通过实现拦截器接口或扩展拦截器类来定义拦截器逻辑。拦截器可以在请求到达控制器之前、之后或视图渲染之前、之后进行处理。

    使用拦截器可以实现各种功能,如身份认证、授权验证、参数校验、异常处理等。它们提供了一种灵活且可重用的方式来扩展和定制应用程序行为。

    在Java中,常见的拦截器实现方式包括Java动态代理、Servlet过滤器、Spring AOP(面向切面编程)等。这些拦截器可以帮助开发人员轻松地实现横切关注点的功能,并提供了一种优雅的解决方案来处理公共的业务逻辑。

     拦截器的工作原理

    拦截器的作用

    1. 日志记录:拦截器可以用于记录系统运行时的关键信息或操作日志,帮助开发人员进行故障排查、性能优化和系统监测。

    2. 认证和授权:拦截器可以实现身份认证和授权验证,确保只有经过认证的用户能够访问受限资源,并根据用户权限决定其可执行的操作。

    3. 参数校验和数据转换:拦截器可以拦截请求,并对请求参数进行验证和转换,确保数据的合法性和正确性,提高系统的稳定性和安全性。

    4. 统一异常处理:拦截器可以捕获和处理应用程序中的异常,提供统一的异常处理逻辑,避免在每个业务方法中都处理相同的异常情况。

    5. 缓存和性能优化:拦截器可以用于缓存数据或计算结果,提高系统的响应速度和性能。

    6. 日志审计:拦截器可以记录用户的操作行为、业务流程等关键信息,用于审计和追踪系统的操作历史。

    7. 事务管理:拦截器可以控制事务的开启、提交或回滚,确保数据库操作的一致性和完整性。

    拦截器的作用不仅限于以上几点,实际上可以根据具体的业务需求定制拦截器的功能和逻辑。它们为应用程序提供了一种灵活和可扩展的方式,实现公共的横切关注点,并提高系统的可维护性和可复用性

    拦截器的使用

    创建一个名为 Interceptor 的包,存放创建自定义拦截器 再创建一个创建自定义拦截器,名为 : OneInterceptor

    1. package com.xiaoxu.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. }

    配置自定义拦截器

    1. <mvc:interceptors>
    2. <bean class="com.xiaoxu.interceptor.OneInterceptor"></bean>
    3. </mvc:interceptors>

     在 Interceptor 的包里,创建一个拦截器 TwoInterceptor。

    1. package com.xiaoxu.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.xiaoxu.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.xiaoxu.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小徐
    8. * @site www.veryedu.cn
    9. * @company xu集团
    10. * @create 2023-09-12 13:27
    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:/clz/list";
    22. }
    23. @RequestMapping("/logout")
    24. public String logout(HttpServletRequest req){
    25. req.getSession().invalidate();
    26. return "redirect:/clz/list";
    27. }
    28. }

    创建一个 login.jsp 的显示页面,进行测试效果 

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: 86155
    4. Date: 2023/9/12
    5. Time: 13:26
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>Title</title>
    12. </head>
    13. <body>
    14. <h1>登录</h1>
    15. <form action="/login" method="post">
    16. 用户:<input name="uname">
    17. <input type="submit">
    18. </form>
    19. </body>
    20. </html>

    测试

  • 相关阅读:
    java商城免费搭建 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城
    Unity2023打包首包从78Mb到3.0Mb-震惊-我做对了什么
    归并排序 图解 递归 + 非递归 + 笔记
    图解系统之 内存管理 —— 摘自小林coding
    react antd下拉选择框选项内容换行
    Linux运维基础知识大全
    ElasticSearch--优化写入速度的方法--单个索引的操作
    初识Java,探索神秘的它
    【rar密码】加密rar压缩包的三种方法
    【向题看齐】408之计算机组成原理概念记忆总结
  • 原文地址:https://blog.csdn.net/m0_74934282/article/details/132813066