SpringMVC之JSR303和拦截器
认识JSR303
JSR303是一项Java标准规范,也叫做Bean Validation规范,提供了一种JavaBean数据验证的规范方式。在SpringMVC中,可以通过引入JSR303相关的依赖,来实现数据的校验。
在使用JSR303进行校验时,需要在需要校验的JavaBean的属性上添加相应的注解,如@NotNull、@Size等。同时,还需要在需要进行校验的方法中使用@Valid注解进行标注,以通知SpringMVC进行校验操作。
JSR303提供了一些基本的校验注解,如@NotNull、@Size、@Pattern等,还可以通过自定义注解来实现更复杂的校验逻辑。除了基本的校验注解之外,JSR303还提供了一些组合注解,如@Valid、@GroupSequence等,可以更灵活地进行校验。
总的来说,JSR303在SpringMVC中的应用非常广泛,可以有效地提高数据的安全性和可靠性。
为什么要用
认识了JSR303那我们为什么要用他呢?
简单易用:JSR303提供了一些简单明了的注解和API,使得验证输入数据变得非常容易。
代码可读性:使用JSR303注解能让代码更具可读性,因为验证的逻辑可以直接在Java Bean中看到。
减少重复代码:使用JSR303注解可以避免编写重复的验证代码,并降低了维护和测试成本。
标准化:JSR303是Java EE标准之一,使用它可以使得代码更加标准化、可移植。
安全性:使用JSR303注解可以提高代码的安全性,因为可以对输入数据进行有效的验证,从而避免了安全漏洞的出现。
可扩展性:JSR303提供了一种简单的机制来扩展验证规则,从而使其满足应用程序的需求。
注解
给大家解释一下
JSR303的注解主要用于验证Java Bean的属性,以确保属性的有效性和完整性。具体来说,主要有以下作用:
-
更方便地验证输入数据:通过使用JSR303的注解,可以很方便地验证输入数据是否符合要求,从而减少了开发人员的工作量。
-
提高程序的可维护性:通过在Java Bean的属性上定义验证规则,可以将验证逻辑与业务逻辑分离,从而使程序更易于维护和扩展。
-
增加程序的健壮性:通过对Java Bean属性的验证,可以有效地防止非法输入数据对程序的影响,减少程序出错的概率,增加程序的健壮性。
-
提高程序的安全性:通过对Java Bean属性的验证,可以确保输入数据的有效性和完整性,从而减少了程序被攻击的风险。
1. @NotNull:验证字段不为null。
2. @NotBlank:验证字段不为空,即长度大于0,去掉空格后长度大于0。
3. @NotEmpty:验证字段不为空,即长度大于0。
4. @Min:验证数字字段的最小值。
5. @Max:验证数字字段的最大值。
6. @Size:验证字段的大小范围。
7. @DecimalMin:验证十进制数字段的最小值。
8. @DecimalMax:验证十进制数字段的最大值。
9. @Pattern:验证字段匹配正则表达式。
10. @Email:验证字段为Email格式。
11. @Length:验证字段的长度。
12. @Range:验证字段的值在范围内。
13. @Valid:验证嵌套对象。
14. @AssertTrue:验证字段为true。
15. @AssertFalse:验证字段为false。
16. @Past:验证日期字段在当前时间之前。
17. @Future:验证日期字段在当前时间之后。
总之,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>
MusicController
在我们的MusicController方法中添加以下代码
// 给数据添加服务端校验@RequestMapping("/valiAdd")public String valiAdd(@Validated Music music, BindingResult result, HttpServletRequest req){
// 如果服务端验证不通过,有错误if(result.hasErrors()){
// 服务端验证了实体类的多个属性,多个属性都没有验证通过List<FieldError> fieldErrors = result.getFieldErrors();Map<String,Object> 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.musicBiz.insertSelective(music);return "redirect:list";}return "mic/edit";}
配置校验
制定规则限制他
@NotNull(message = "学生编号不能为空")private Integer mid;@NotBlank(message = "学生名称不能为空")private String mname;@NotBlank(message = "学生年龄不能为空")private String mtype;@NotBlank(message = "学生性别不能为空")private String minfo;
认识拦截器
Spring拦截器(Interceptor)是Spring MVC框架中的一种机制,用于在请求处理前和请求处理后拦截请求。Spring的拦截器类似于JavaEE中的过滤器(Filter),但是比过滤器更加灵活和强大。
Spring拦截器通过在配置文件中配置拦截器实现类,来将拦截器注入到Spring容器中。拦截器可以对请求进行前置处理(preHandle)、后置处理(postHandle)和完成处理(afterCompletion)。在拦截器中,可以实现很多业务逻辑,比如:日志记录、权限验证、参数验证等。
Spring拦截器可以拦截MVC请求、WebSocket请求、Restful请求等。在拦截器中,可以获取请求的相关参数、请求头等信息,可以对请求参数进行验证和修改,还可以在请求前后记录日志等操作。
使用Spring拦截器可以让我们的代码更加简洁,更加易于维护和扩展。同时,它也提高了代码的可用性和可读性,使我们的应用程序更加健壮和高效。
为什么要用拦截器
拦截器是一种在请求处理前或处理后拦截请求和响应的机制。它可以在请求到达目标之前对请求进行预处理或在目标处理完响应后对响应进行后续处理。拦截器的作用是可以统一处理请求和响应数据,比如请求参数的校验、权限认证、日志记录等,可以减少代码重复、提高代码复用性、增强代码的可维护性和可测试性。此外,拦截器可以对请求和响应数据做出细粒度的控制,可以在某些特定的请求或响应条件下触发特定的处理逻辑,从而满足业务需求。因此,使用拦截器可以让我们更好地控制和管理请求和响应数据,提高应用程序的可靠性和安全性。
拦截器应用的场景
请求参数的校验:可以对请求中的参数进行非空、数据类型、长度等方面的校验,增强应用程序的健壮性。
权限认证:可以对用户的登录状态、权限、角色等方面进行认证和授权,保护应用程序的安全性。
日志记录:可以在请求进入和响应退出时记录相关的系统日志,方便开发人员进行问题排查和性能优化。
缓存处理:可以对某些请求进行缓存,避免重复查询数据库等操作,提高应用程序的性能。
数据加密:可以对请求和响应数据进行加密和解密,保护敏感数据的安全性。
异常处理:可以在请求处理发生异常时进行处理,返回特定的错误信息,避免系统崩溃或返回不友好的错误信息。
总之,拦截器可以应用于几乎所有的 Web 应用程序,可以对请求和响应数据进行各种处理和控制,从而提高应用程序的可靠性、安全性和性能。
过滤器与拦截器的区别
过滤器属于Servlet规范的一部分,拦截器则是SpringMVC框架的一部分。
过滤器的作用范围是Servlet,拦截器的作用范围是方法级别和类级别。
过滤器可以修改HTTP请求和响应,拦截器可以在执行方法之前、之后、异常抛出后等不同的阶段进行处理。
过滤器使用Servlet容器管理,拦截器则使用Spring容器管理。
过滤器可以防止恶意访问和跨站脚本攻击等,拦截器可以实现权限验证、日志记录等。
用户登录权限
Spring-mvc
Spring-mvc.xml中配置多拦截器
<!--<!– 用户权限的请求拦截–>--><mvc:interceptors><bean class="com.zhanghao.interceptor.LoginInterceptor"></bean></mvc:interceptors><mvc:interceptors><!--2) 多拦截器(拦截器链)--><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.zhanhao.interceptor.OneInterceptor"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/mic/**"/><bean class="com.zhanghao.interceptor.TwoInterceptor"/></mvc:interceptor></mvc:interceptors>
LoginInterceptor
创造一个LoginInterceptor拦截器
package com.zhnaghao.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 {@Overridepublic 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 mname = (String) request.getSession().getAttribute("mname");if (mname == null || "".equals(mname)){response.sendRedirect("/page/login");return false;}return true;}@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 {}
}
OneInterceptor
package com.zhanghao.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 {@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...");}
}
TwoInterceptor
package com.zhanghao.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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("【TwoInterceptor】:preHandle...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("【TwoInterceptor】:postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("【TwoInterceptor】:afterCompletion...");}
}
jsp
接着创造一个新的jsp,用来写我们的登入页面代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用户登入</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/login" method="post" enctype="multipart/form-data"><label>用户名称:</label><br/><input type="text" name="mname"/><br/><input type="submit" value="登入"/>
</form>
</body>
</html>
今天的分享就到这了
相关文章:

SpringMVC之JSR303和拦截器
认识JSR303 JSR303是一项Java标准规范,也叫做Bean Validation规范,提供了一种JavaBean数据验证的规范方式。在SpringMVC中,可以通过引入JSR303相关的依赖,来实现数据的校验。 在使用JSR303进行校验时,需要在需要校验的…...

通过rabbitmq生成延时消息,并生成rabbitmq镜像
通过rabbitmq生成延时消息队列,并生成rabbitmq镜像 整体描述1. 使用场景2. 目前问题3. 前期准备 具体步骤1. 拉取镜像2. 运行镜像3. 安装插件4. 代码支持4.1 config文件4.2 消费监听4.2 消息生产 5. 功能测试 镜像操作1. 镜像制作2. 镜像导入 总结 整体描述 1. 使用…...
结构型模式-外观模式
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系…...

vue三个点…运算符时报错 Syntax Error: Unexpected token
出现以下问题报错: 解决: 在项目根目录新建一个名为.babelrc的文件 {"presets": ["stage-2"] }...

C# wpf 实现桌面放大镜
文章目录 前言一、如何实现?1、制作无边框窗口2、Viewbox放大3、截屏显示(1)、截屏(2)、转BitmapSource(3)、显示 4、定时截屏 二、完整代码三、效果预览总结 前言 做桌面截屏功能时需要放大镜…...
Mybatis中的#{}和${}的区别
#{}和${}他们两都是替换参数的作用,但也还是有很大区别的。 目录 一、${} 二、#{} 三、注意点 一、${} 它是直接替换过来,不添加其它的什么。 比如下面的sql语句 select *from user where id${id} 如果id1,那么他替换过来就还是1ÿ…...

选择(使用)数据库
MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: use 数据库名称;大家应该知道,在对数据库进行操作的时候,要制定数据库的操作对象,也就是说操作哪一个数据库 案列:选择testing数据库 …...

GFS分布式文件系统
1、GlusterFS简介 GlusterFS(GFS)是一个开源的分布式文件系统 由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。MFS 传统的分布式文件系统大多通过元服务器来存储元数据,元数据…...

虚函数、纯虚函数、多态
一.虚函数 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。 …...

QGIS学习3 - 安装与管理插件
QGIS安装与管理插件主要是使用了菜单栏安装与管理插件这个菜单。 1、通过压缩文件等添加非官方插件 通过压缩文件添加有可能会提示存在安全问题等,直接点是即可。 之后点击install plugins即可完成。安装后导入插件 但是load失败了应该是安装没有成功。只能通过u…...
LeetCode377. 组合总和 Ⅳ
377. 组合总和 Ⅳ 文章目录 [377. 组合总和 Ⅳ](https://leetcode.cn/problems/combination-sum-iv/)一、题目二、题解方法一:完全背包一维数组动态规划思路代码分析 方法二:动态规划二维数组 一、题目 给你一个由 不同 整数组成的数组 nums ࿰…...
QT将数据写入文件,日志记录
项目场景: 在QT应用中,有时候需要将错误信息记录在log文件里面,或者需要将数据输出到文件中进行比对查看使用。 创建log文件,如果文件存在则不创建 QDir dir(QCoreApplication::applicationDirPath()"/recv_data");if(…...
vue2与vue3的使用区别与组件通信
1. 脚手架创建项目的区别: vue2: vue init webpack “项目名称”vue3: vue create “项目名称” 或者vue3一般与vite结合使用: npm create vitelatest yarn create vite2. template中结构 vue2: template下只有一个元素节点 <template><div><div…...

亚信科技与中国信通院达成全方位、跨领域战略合作
9月11日,亚信科技(中国)有限公司「简称:亚信科技」与中国信息通信研究院「简称:中国信通院」在京达成战略合作,双方将在关键技术研发、产业链协同等方面展开全方位、跨领域、跨行业深度合作,共促…...
华为Linux系统开发工程师面试
在Linux系统开发工程师的面试中,你可能会遇到以下一些问题: 在同一个网站中,当客户访问的时候,会出现有的页面访问的速度快而有的慢,系统和服务完全正常、网络带宽正常,你如何诊断这个问题?你以…...
Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题
Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题 文章目录 Qt利用QTime实现sleep效果分时调用串口下发报文解决串口下发给下位机后产生的粘包问题现象解决方法 现象 当有多包数据需要连续下发给下位机时,比如下载数据等&#x…...

人工智能:神经细胞模型到神经网络模型
人工智能领域中的重要流派之一是:从神经细胞模型(Neural Cell Model)到神经网络模型(Neural Network Model)。 一、神经细胞模型 第一个人工神经细胞模型是“MP”模型,它是由麦卡洛克、匹茨合作࿰…...

Redisson分布式锁实战
实战来源 此问题基于电商 这周遇见这么一个问题,简略的说一下 由MQ发布了两个消息,一个是订单新增,一个是订单状态变更 由于直接付款之后,这两个消息的发布时间不分先后,可能会造成两种情况,1、订单状态变更…...

JavaScript中循环遍历数组、跳出循环和继续循环
循环遍历数组 上个文章我们简单的介绍for循环,接下来,我们使用for循环去读取数据的数据,之前我们写过这样的一个数组,如下: const ITshareArray ["张三","二愣子","2033-1997","…...
Java——》Synchronized和Lock区别
推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...