【SpringMVC】JSR303与拦截器的使用

文章目录

  • 一、JSR303
    • 1.1 JSR303是什么
    • 1.2 JSR 303的好处包括
    • 1.3 常用注解
    • 1.4 实例
      • 1.4.1 导入JSR303依赖
      • 1.4.2 规则配置
      • 1.4.3 编写校验方法
      • 1.4.4 编写前端
  • 二、拦截器
    • 2.1 拦截器是什么
    • 2.2 拦截器与过滤器的区别
    • 2.3.应用场景
    • 2.4 快速入门
    • 2.5.拦截器链
    • 2.6 登录拦截权限案例
      • 2.6.1 LoginController.java
      • 2.6.2 配置拦截器
      • 2.6.3 创建拦截器
      • 2.6.4 测试

一、JSR303

1.1 JSR303是什么

JSR 303是Java规范请求(Java Specification Request)的编号,它定义了Java Bean验证的标准规范。JSR 303的全称是Bean Validation,它提供了一种在Java应用程序中进行数据验证的机制。

Bean Validation是一种基于注解的验证框架,它允许开发人员在Java Bean的属性上添加验证规则,以确保数据的合法性和完整性。通过使用Bean Validation,开发人员可以在数据输入阶段就捕获错误,避免后续可能出现的潜在问题。

1.2 JSR 303的好处包括

  1. 简化验证逻辑:通过使用注解,开发人员可以在Java Bean的属性上直接添加验证规则,而不需要编写繁琐的验证代码。
  2. 统一验证规范:JSR303定义了一组常用的验证注解,使得不同的开发人员在验证过程中可以使用相同的规范,提高了代码的可读性和可维护性。
  3. 提高代码质量:通过在Java Bean中添加验证规则,可以在数据输入阶段就捕获错误,避免了后续可能出现的潜在问题。
  4. 可扩展性:JSR303提供了自定义注解的能力,开发人员可以根据自己的需求定义新的验证注解。

1.3 常用注解

  1. @NotNull:用于验证属性值不能为null。
  2. @Size:用于验证字符串、集合或数组的大小是否在指定范围内。
  3. @Min:用于验证数字属性的最小值。
  4. @Max:用于验证数字属性的最大值。
  5. @Pattern:用于验证字符串属性是否符合指定的正则表达式。
  6. @Email:用于验证字符串属性是否符合电子邮件格式。
  7. @NotBlank:用于验证字符串属性是否非空且长度大于0。
  8. @NotEmpty:用于验证字符串、集合或数组属性是否非空。
  9. @Range:用于验证数字属性是否在指定范围内。
  10. @Valid:用于嵌套验证,验证关联对象。

1.4 实例

1.4.1 导入JSR303依赖

<!-- JSR303 -->
<hibernate.validator.version>6.0.7.Final</hibernate.validator.version><!-- JSR303 -->
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate.validator.version}</version>
</dependency>

1.4.2 规则配置

package com.xqx.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;@Data//相当于set get toString方法
@AllArgsConstructor //有参构造器
@NoArgsConstructor //无参构造器
public class Book{@NotBlank(message = “书本信息不能为空!")private String bookName;@NotNull(message = “书本价格不能为空!")private Float bookPrice:private String bookType;}

1.4.3 编写校验方法

  /*** 书本新增* 请求路径 SSM/book/editBook* @param book* @return*/@RequestMapping("/addBook")public String addBook(@Validated Book book, BindingResult bindingResult){System.out.println("进入新增方法");//判断是否验证成功if(bindingResult.hasErrors()){System.out.println("验证失败");//验证失败return "book/addBook";}else {//验证成功bookService.insert(book);return "redirect:queryBookPage";}}/***  @ModelAttribute: 所标记的方法为非请求处理方法,在所有请求方法之前被调用*  @odelAttribute 在所有的@RequestMapping的方法之前被调用!**  作用:数据预加载*  特点:无返回值*/@ModelAttributepublic void init(Model model){System.out.println("非请求处理方法");//必须操作model.addAttribute("book",new Book());}

1.4.4 编写前端

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://www.springframework.org/tags/form" %>
<html>
<head><%@include file="/common/head.jsp"%><title>Title</title>
</head>
<style>.cl{color: red;}</style>
<body>
<h1>书本新增</h1><fmt:form modelAttribute="book"  action="${ctx}/book/addBook" method="post"><label>书本名称:</label><input type="text" name="bookName"><fmt:errors cssClass="cl" path="*"/><br/><label>书本价格:</label><input type="text" name="bookPrice"><%--<fmt:errors cssClass="cl"  path="bookPrice"/>--%><br/><label>书本类型:</label><select name="bookType"><option value="神话">神话</option><option value="教育">教育</option><option value="文学">文学</option><option value="玄幻">玄幻</option></select><br/><input type="submit" value="添加"></fmt:form></body>
</html>

在这里插入图片描述

二、拦截器

2.1 拦截器是什么

SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。

2.2 拦截器与过滤器的区别

拦截器(Interceptor)通常是指一种拦截和处理请求的组件或模块。它可以在请求到达目标之前或之后进行拦截,并对请求进行修改、记录或处理。拦截器通常用于实现横切关注点(cross-cutting concerns),如日志记录、安全认证、性能监控等。拦截器可以在应用程序的不同层级中使用,例如在网络层、业务逻辑层或数据访问层。

过滤器(Filter)则是一种用于过滤和处理数据的组件或模块。它可以在数据流经过时对数据进行过滤、转换或处理。过滤器通常用于对数据进行预处理或后处理,以满足特定的需求或要求。常见的应用包括数据清洗、数据转换、数据压缩等。过滤器可以在不同的数据处理环节中使用,例如在输入输出流、数据库查询、图像处理等。

2.3.应用场景

  • 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
  • 权限检查:如登录检测,进入处理器检测是否登录,如果没有直接返回到登录页面;
  • 性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个Controller中的处理方法都需要的,我们就可以使用拦截器实现。

2.4 快速入门

创建拦截器

package com.xqx.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*
1. 定义拦截器类,实现HandlerInterceptor接口
2. 注意当前类必须受Spring容器控制*/
public class OneInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("【OneInterceptor】:preHandle...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("【OneInterceptor】:postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("【OneInterceptor】:afterCompletion...");}
}

配置拦截器

在spring-mvc.xml中配置:

    <!--配置拦截器--><mvc:interceptors><bean class="com.xqx.interceptor.OneInterceptor"></bean></mvc:interceptors>

2.5.拦截器链

如果多个拦截器能够对相同的请求进行拦截,则多个拦截器会形成一个拦截器链,主要理解拦截器链中各个拦截器的执行顺序。拦截器链中多个拦截器的执行顺序,根拦截器的配置顺序有关,先配置的先执行。

在spring-mvc.xml中配置多个拦截器

    <!--2) 多拦截器(拦截器链)--><mvc:interceptors><mvc:interceptor><!--拦截所有--><mvc:mapping path="/**"/><bean class="com.xqx.interceptor.OneInterceptor"/></mvc:interceptor><mvc:interceptor><!--拦截users下的controller--><mvc:mapping path="/book/**"/><bean class="com.xqx.interceptor.TwoInterceptor"/></mvc:interceptor></mvc:interceptors>

使用了拦截器链的效果
在这里插入图片描述

2.6 登录拦截权限案例

2.6.1 LoginController.java

package com.xqx.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;@Controller
public class LoginController {/*** 跳转到登录页面* @return*/@RequestMapping("tologin")public String toLogin(){return "login";}/*** 登录方法* @param username 账号* @param password 密码* @return*/@RequestMapping("/userLogin")public String userLogin(String username, String password, HttpSession session, Model model){if("admin".equals(username)|| password.equals("123")){session.setAttribute("username",username);//这里的"/"是跳转的@RequestMapping配置的值return "redirect:/";}model.addAttribute("msg","账号或者密码错误");return "login";}/*** 安全退出* @param session* @return*/@RequestMapping("/userLogout")public String userLogout(HttpSession session){//清空sessionsession.invalidate();return "redirect:tologin";}}

2.6.2 配置拦截器

<mvc:interceptors><bean class="com.xqx.interceptor.LoginInterceptor"></bean>
</mvc:interceptors>

2.6.3 创建拦截器

package com.xqx.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取请求路径String url = request.getRequestURI();System.out.println(url);//判断是否是跳转登录页面的请求 放行if(url.indexOf("/tologin")>0)return true;//判断是否是用户登录 放行if(url.indexOf("/userLogin")>0)return true;//获取sessionHttpSession session = request.getSession();//获取session中的用户对象String username = (String) session.getAttribute("username");//判断session中的用户对象是否存在,存在放行,不存在跳转登录页面if(username!=null)return true;request.setAttribute("msg","您还没有登录,请登录!");request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

2.6.4 测试

账号密码错误的情况下
在这里插入图片描述
在未登录的情况下访问首页
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/134862.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker搭建ELK日志采集服务及Kibana可视化图表展示

架构 ES docker network create elkmkdir -p /opt/ELK/es/datachmod 777 /opt/ELK/esdocker run -d --name elasticsearch --net elk -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -v /opt/ELK/es/plugins:/usr/share/elasticsearch/plugins -v /opt/…

蓝桥杯2023年第十四届省赛真题-更小的数--题解

目录 蓝桥杯2023年第十四届省赛真题-更小的数 题目描述 输入格式 输出格式 样例输入 样例输出 提示 【思路解析】 【代码实现】 蓝桥杯2023年第十四届省赛真题-更小的数 时间限制: 3s 内存限制: 320MB 提交: 895 解决: 303 题目描述 小蓝有一个长度均为 n 且仅由数字…

RK3588 点亮imx586摄像头

一.硬件原理图 mipi摄像头硬件确认点&#xff1a; 1.供电&#xff1a;5V&#xff0c;2.8V&#xff0c;1.2V&#xff0c;1.8V&#xff0c;reset脚&#xff08;硬拉3.3&#xff0c;上电的时候从低到高&#xff09;&#xff0c;pwron脚外接 3.3V。 2,时钟&#xff1a;MCLKOUT是2…

Linux 文件创建、查看

touch、cat、more命令 ①touch命令——创建文件 ②cat命令——查看文件内容全部显示 这是txt.txt文件内容 使用cat命令查看 ③more命令——查看文件内容支持翻页 在查看的过程中&#xff0c;通过空格翻页&#xff0c;通过q退出查看

基于Xml方式Bean的配置-初始化方法和销毁方法

SpringBean的配置详解 Bean的初始化和销毁方法配置 Bean在被实例化后&#xff0c;可以执行指定的初始化方法完成一些初始化的操作&#xff0c;Bean在销毁之前也可以执行指定的销毁方法完成一些操作&#xff0c;初始化方法名称和销毁方法名称通过 <bean id"userService…

linux万字图文学习进程信号

1. 信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 1.1 linux中我们常用Ctrlc来杀死一个前台进程 1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。2. S…

微服务架构介绍

系统架构的演变 1、技术架构发展历史时间轴 ①单机垂直拆分&#xff1a;应用间进行了解耦&#xff0c;系统容错提高了&#xff0c;也解决了独立应用发布的问题&#xff0c;存在单机计算能力瓶颈。 ②集群化负载均衡可有效解决单机情况下并发量不足瓶颈。 ③服务改造架构 虽然系…

解决Springboot使用Junit测试时对数据库的修改无效

现象 在使用Junit做单元测试的过程中&#xff0c;比如对mybatis的dao进行单元测试&#xff0c;发现对数据库的select操作正常&#xff0c;可以获取数据&#xff0c;但insert、update、delete操作即使运行不报错&#xff0c;仍然不能不能对数据产生修改和插入。 原因和解决 原…

FreeSWITCH 1.10.10 简单图形化界面10 - 鼎兴FXO网关SIP注册公网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面10 - 鼎兴FXO网关SIP注册公网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX SIP中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关端口组呼入号码7、设置FXO网关呼叫路由&#xff08;呼入及…

千兆以太网硬件设计及链路层 MAC 协议格式

以太网系列文章&#xff1a; &#xff08;1&#xff09;千兆以太网硬件设计及链路层 MAC 协议格式 &#xff08;2&#xff09;千兆以太网网络层 ARP 协议的原理与 FPGA 实现 &#xff08;3&#xff09;CRC校验代码原理 文章目录 前言一、以太网 MAC 层接口介绍1.MII 接口2.GMII…

进制转换问题

进制 二进制 &#xff08;Binary&#xff09;&#xff1a;0、1。简写为B 八进制&#xff08;Octonary&#xff09;&#xff1a;0、1、2、3、4、5、6、7。简写为O 十进制&#xff08;decimalism&#xff09;&#xff1a;0、1、2、3、4、5、6、7、8、9 简写为D 十六进制&#xff…

Nacos深入原理从源码层面讲解

文章目录 1 Nacos原理1.1 Nacos架构1.2 注册中心原理1.3 SpringCloud服务注册1.4 NacosServiceRegistry实现1.4.1 心跳机制1.4.2 注册原理1.4.3 总结 1.5 服务提供者地址查询1.6 Nacos服务地址动态感知原理 1 Nacos原理 1.1 Nacos架构 Provider APP&#xff1a;服务提供者Cons…

如何从第一性原则的原理分解数学问题

如何从第一性原则的原理分解数学问题 摘要&#xff1a;牛津大学入学考试题目展示了所有优秀数学家都使用的系统的第一原则推理&#xff0c;而GPT4仍然在这方面有困难 作者&#xff1a;Keith McNulty 我们中的许多人都熟悉直角三角形的边的规则。根据毕达哥拉斯定理&#xff0c;…

Kotlin File useLines nameWithoutExtension extension

Kotlin File useLines nameWithoutExtension extension import java.io.Filefun main(args: Array<String>) {val filePath "myfile.txt"val file File(filePath)println(file.name) //文件名字&#xff0c;不包括路径println(file.isFile) //是文件吗pri…

VBA技术资料MF57:VBA_自动创建PowerPoint演示文稿

【分享成果&#xff0c;随喜正能量】会因为有情绪而烦闷&#xff0c;也因为没控制情绪而懊悔。莫道幽人一事无&#xff0c;闲中尽有静工夫。情绪就像水&#xff0c;宜疏不宜堵。学会控制情绪&#xff0c;不能把情绪看得过重&#xff0c;也不能一味遏制情绪的产生。倾听所有声音…

【Linux操作系统】信号的产生捕获

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1f6f0…

学习计算机网络中的一些疑问及解答

文章目录 前言一、为什么要进行三次握手二、三次握手的流程三、三次握手中seq和ack的值四、四次挥手流程五、四次挥手中seq和ack的值六、为什么要等待才回复七、为什么等待2MSL总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;在学习计算机网络的过程中遇…

780. 到达终点;2360. 图中的最长环;1871. 跳跃游戏 VII

780. 到达终点 核心思想&#xff1a;正难则反&#xff0c;如果从起点到终点很难想。那么我们就考虑从终点到起点&#xff0c;由于起点为正数&#xff0c;那么终点&#xff08;x,y&#xff09;的上一步一定是&#xff08;x-y,y&#xff09;或者(x,y-x)很明显肯定是大值减去小的…

Vue 2 组件间的通信方式总结

引言 组件间的关系有父子关系、兄弟关系、祖孙关系和远亲关系。 不同的关系间&#xff0c;组件的通信有不同的方式。 一、prop 和 $emit prop向下传递&#xff0c;emit向上传递。 父组件使用 prop 向子组件传递信息。 ParentComponent.vue <template><div><…

5-2 Pytorch中的模型层layers

深度学习模型一般由各种模型层组合而成。 torch.nn中内置了非常丰富的各种模型层。它们都属于nn.Module的子类&#xff0c;具备参数管理功能。 例如&#xff1a; nn.Linear, nn.Flatten, nn.Dropout, nn.BatchNorm2d, nn.Embedding nn.Conv2d,nn.AvgPool2d,nn.Conv1d,nn.ConvTr…