【SpringMVC】拦截器JSR303的使用

【SpringMVC】拦截器&JSR303的使用

  • 1.1 什么是JSR303
  • 1.2 为什么使用JSR303
  • 1.3 常用注解
  • 1.4 @Validated与@Valid区别
  • 1.5 JSR快速入门
  • 1.5.2 配置校验规则
  • # 1.5.3 入门案例
  • 二、拦截器
    • 2.1 什么是拦截器
    • 2.2 拦截器与过滤器
    • 2.3 应用场景
    • 2.4 拦截器快速入门
    • 2.5.拦截器链
    • 2.6登录案列权限控制

1.1 什么是JSR303

JSR303是Java规范中定义的一套用于数据校验的标准,也被称为Bean Validation。它提供了一组注解,用于验证Java对象的属性值是否满足特定的约束条件。

1.2 为什么使用JSR303

使用JSR303可以在服务器端对用户提交的数据进行验证,确保数据的合法性和有效性。它可以减少开发人员编写大量的校验逻辑代码,提高开发效率,并且可以在不同层次(如控制器、服务层、DAO)进行数据验证,保证数据的一致性。

1.3 常用注解

常见的JSR303注解包括:

@NotNull:验证对象不为null。
@NotEmpty:验证字符串、集合、数组不为空。
@NotBlank:验证字符串不为空,并且长度必须大于0。
@Size:验证字符串、集合、数组的长度范围。
@Min:验证数字的最小值。
@Max:验证数字的最大值。
@Pattern:验证字符串是否匹配指定的正则表达式。

1.4 @Validated与@Valid区别

@Valid是Java标准的注解,用于触发对被注解对象的校验。它可以直接放在方法参数上,或者作为Spring MVC中处理请求体参数校验的一部分。
@Validated是Spring框架提供的注解,与@Valid类似,但功能更加强大。它可以用于类、方法和方法参数级别的校验,并且支持分组校验等高级特性。

1.5 JSR快速入门

1.5.1 导入依赖
在Maven项目中,需要导入javax.validation相关的依赖。

<!-- 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.5.2 配置校验规则

通过在实体类的字段上添加不同的JSR303注解,定义校验规则。

在这里插入package com.niyin.biz.impl;import com.niyin.biz.tyBiz;
import com.niyin.mapper.tyMapper;
import com.niyin.model.ty;
import com.niyin.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Map;@Service
public class tyBizImpl implements tyBiz {@Autowiredprivate tyMapper tyMapper;@Overridepublic int deleteByPrimaryKey(Integer tid) {return tyMapper.deleteByPrimaryKey(tid);}@Overridepublic int insert(ty record) {return tyMapper.insert(record);}@Overridepublic int insertSelective(ty record) {return tyMapper.insertSelective(record);}@Overridepublic ty selectByPrimaryKey(Integer tid) {return tyMapper.selectByPrimaryKey(tid);}@Overridepublic int updateByPrimaryKeySelective(ty record) {return tyMapper.updateByPrimaryKeySelective(record);}@Overridepublic int updateByPrimaryKey(ty record) {return tyMapper.updateByPrimaryKey(record);}@Overridepublic List<ty> selectByPager(ty t, PageBean pageBean) {return tyMapper.selectByPager(t);}
}

# 1.5.3 入门案例

在控制器中接收用户提交的数据,并使用@Validated注解进行数据校验。如果校验失败,则返回错误信息给客户端。

  @RequestMapping("/valiAdd")public String valiAdd(@Validated ty t, 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.tyBiz.insertSelective(t);return "redirect:list";}return "edit";}
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>博客的编辑界面</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/clz/${empty ts ? 'valiAdd' : 'edit'}" method="post">id:<input type="text" name="tid" value="${ts.tid }"><span style="color: red;">${errorMap.tid}</span><br>bname:<input type="text" name="tname" value="${ts.tname }"><span style="color: red;">${errorMap.tname}</span><br>price:<input type="text" name="tprice" value="${ts.tprice }"><span style="color: red;">${errorMap.tprice}</span><br><input type="submit">
</form>
</body>
</html>

在这里插入图片描述

二、拦截器

2.1 什么是拦截器

拦截器(Interceptor)是在Web应用程序中常用的一种技术,用于在请求被处理前后进行拦截和处理。它可以在控制器和处理器之间进行预处理和后处理操作。

2.2 拦截器与过滤器

拦截器和过滤器都可以用于对请求进行处理,但它们在使用方式和功能上有一些区别。过滤器是基于Servlet规范的,可以对所有请求进行处理,而拦截器是基于Spring MVC框架的,只能对包含了拦截器配置的请求进行处理。

2.3 应用场景

拦截器可以应用在各种场景下,常见的使用场景包括权限验证、日志记录、异常处理、缓存处理等。它可以对请求进行统一处理,简化开发流程,并提高代码的可维护性和重用性。

2.4 拦截器快速入门

2.4.1 入门案例

package com.niyin.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...");}
}

spring_mvc配置拦截器器

  <mvc:interceptors>--><bean class="com.niyin.interceptor.OneInterceptor"></bean></mvc:interceptors>-->

结论:拦截器会根据preHandle()方法返回值进行拦截判断,返回了一个true值。这个返回值表示该拦截器已经处理了当前的请求,并且可以继续向下传递请求。如果返回false,则表示该拦截器不处理当前请求,请求将被终止。

2.5.拦截器链

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

package com.niyin.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...");}
}

spring_mvc

 <mvc:interceptors><!--2) 多拦截器(拦截器链)--><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.niyin.interceptor.OneInterceptor"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/clz/**"/><bean class="com.niyin.interceptor.TwoInterceptor"/></mvc:interceptor></mvc:interceptors>

2.6登录案列权限控制

package com.niyin.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@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:/clz/list";}@RequestMapping("/logout")public String logout(HttpServletRequest req){req.getSession().invalidate();return "redirect:/clz/list";}
}
package com.niyin.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 uname = (String) request.getSession().getAttribute("uname");if (uname == null || "".equals(uname)){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 {}
}

Sping_mvc

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

jsp

<%--Created by IntelliJ IDEA.User: 林墨Date: 2023/9/12Time: 23:14To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录界面</title>
</head>
<body>
<form action="/login" method="post">用户<input name="uname"><input type="submit"></form>
</body>
</html>

在这里插入图片描述

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

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

相关文章

ZTMap是如何在相关政策引导下让建筑更加智慧化的?

近几年随着智慧楼宇概念的深入&#xff0c;尤其是在“十四五规划”“新基建”“数字经济”等相关战略和政策的引导下&#xff0c;智慧楼宇也迎来了快速发展期&#xff0c;对推动智慧城市系统的建设越来越重要。那么究竟什么是智慧楼宇呢&#xff1f;智慧楼宇其实就是整合楼宇内…

神经元量子点处理器赋能,三星QN85Z电视带来高品质视听盛宴

我们注意到近期三星发布新款Neo QLED电视QN85Z&#xff0c;有感于三星在芯片、面板技术等方面的深厚积累&#xff0c;我们对三星新发布的这款电视相当感兴趣。QN85Z新品搭载了三星“集成之芯”——神经元量子点处理器&#xff0c;搭配高端量子点Mini LED带来更为优化的画质和音…

IPV4和IPV6,公网IP和私有IP有什么区别?

文章目录 1、什么是IP地址&#xff1f;1.1、背景1.2、交换机1.3、局域网1.4、广域网1.5、ISP 互联网服务提供商 2、IPV42.1、什么是IPV4&#xff1f;2.2、IPV4的组成2.3、NAT 网络地址转换2.4、端口映射 3、公网IP和私有IP4、IPV6 1、什么是IP地址&#xff1f; 1.1、背景 一台…

机器人如何有效采摘苹果?

摘要&#xff1a;本文利用动捕数据构建拟人运动模型&#xff0c;对比观察两种苹果采摘模式&#xff0c;并对系统性能进行全面评估&#xff0c;为提高机器人采摘效率提供创新方法。 近期&#xff0c;一项关于苹果采摘机器人的有趣研究—— "Design and evaluation of a rob…

Git学习笔记8

Gitlab&#xff1a; Gitlab是利用Ruby on Rails 一个开源的版本管理系统&#xff0c;实现一个自托管的git项目仓库&#xff0c;可通过web界面进行访问公开或私有的项目。 Gitlab安装&#xff1a; 安装之前&#xff0c;将虚拟机的内存改成了4个G。内存如果太小&#xff0c;会有…

巧用“加减乘除”,停车场“碳”出节能发展新路

“绿色化、低碳化是高质量发展的关键”。中国电信以先驱姿态&#xff0c;积极贯彻“碳达峰碳中和”国家战略&#xff0c;以科技为画笔&#xff0c;绿色生态为底色&#xff0c;绘就节能低碳发展新蓝图。 在湖北省某办公楼宇&#xff0c;物业管理员因停车场照明现状发了愁。在过去…

Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

Unity 开发人员的城堡游戏引擎概述 一、简介2. Unity相当于什么GameObject&#xff1f;3. 如何设计一个由多种资产、生物等组成的关卡&#xff1f;4. 在哪里放置特定角色的代码&#xff08;例如生物、物品&#xff09;&#xff1f;Unity 中“向 GameObject 添加 MonoBehaviour”…

1_图神经网络GNN基础知识学习

文章目录 安装PyTorch Geometric安装工具包 在KarateClub数据集上使用图卷积网络 (GCN) 进行节点分类两个画图函数Graph Neural Networks数据集&#xff1a;Zacharys karate club network.PyTorch Geometric数据集介绍 edge_index使用networkx可视化展示 Graph Neural Networks…

element-table出现错位解决方法

先看示例图&#xff0c;这个在开发中还是很常遇到的&#xff0c;在table切换不同数据时或者切换页面时&#xff0c;容易出现&#xff1a; 解决方法很简单&#xff0c;官方有提供方法&#xff1a; 我们可以在重新渲染数据后&#xff1a; this.$nextTick(() > {this.$refs.…

嵌入式笔试面试刷题(day15)

文章目录 前言一、Linux中的主设备号和次设备号1.查看方法2.主设备号和次设备号的作用 二、软件IIC和硬件IIC的区别三、变量的声明和定义区别四、static在C和C中的区别五、串口总线空闲时候的电平状态总结 前言 本篇文章继续讲解嵌入式笔试面试刷题&#xff0c;希望大家坚持跟…

【超实用】2023年,学生上班族如何简单快速,低成本的搭建一个博客网站

文章目录 前言实操环节香港虚拟机购买博客搭建ssl证书配置备份设置 总结 前言 因为工作和生活的需要&#xff0c;我一直有博客的搭建需求。我将总结下来&#xff0c;为读者提供参考。  起初&#xff0c;我采用的是香港云虚拟主机&#xff0c;这种虚拟机极其便宜&#xff08;一…

什么样的应用程序适合使用Flutter开发桌面?

桌面应用开发的现状 在过去&#xff0c;桌面应用程序的开发通常需要使用特定于操作系统的工具和语言&#xff0c;如C、C#、Java等。这导致了高昂的开发成本和维护困难。尽管有一些跨平台桌面开发工具&#xff0c;如Electron和Qt&#xff0c;但它们在性能、用户体验和开发效率方…

Linux Static Key原理与应用

文章目录 背景1. static-key的使用方法1.1. static-key定义1.2 初始化1.3 条件判断1.4 修改判断条件 2、示例代码参考链接 背景 内核中有很多判断条件在正常情况下的结果都是固定的&#xff0c;除非极其罕见的场景才会改变&#xff0c;通常单个的这种判断的代价很低可以忽略&a…

Python3 语法简明教程

目录 0 前言1 输出语句、注释1.1 输出语句1.2 单行、多行注释 2 变量与对象、输入语句2.1 变量与对象2.2 数字类型和运算符2.3 输入语句 3 条件控制、循环语句3.1 条件控制3.2 循环语句3.2.1 while...else3.2.2 for...else 4 字典5 元组、列表5.1 元组5.2 列表 6 集合、推导式6…

C语言——贪吃蛇小游戏

目录 一、ncurse 1.1 为什么需要用ncurse&#xff1a; 1.2 ncurse的输入输出&#xff1a; 1.2.1 如何使用ncurse&#xff1a; 1.2.2 编译ncurse的程序&#xff1a; 1.2.3 测试输入一个按键ncurse的响应速度&#xff1a; 1.3 ncurse上下左右键获取&#xff1a; 1.3.1 如…

【IntelliJ IDEA】cmd和idea Terminal查看java版本不一致

问题描述 原来win10电脑上安装的是jdk8的版本&#xff0c;因某些原因&#xff0c;现在想换成jdk7的版本&#xff0c;修改环境变量后&#xff0c;在cmd中执行 [java -version]命令&#xff0c;显示的是7的版本。 但在idea的Terminal中执行&#xff0c;确实显示8的版本。 原因分…

基于深度强化学习的四旋翼无人机航线跟随

源自&#xff1a;指挥与控制学报 作者&#xff1a;杨志鹏 李波 甘志刚 梁诗阳 摘 要 针对无人机在空中执行航线跟随任务时无法对未知环境作出合理应对措施等问题, 提出了一种基于深度强化学习的四 旋翼无人机航线跟随方法. 通过无人机受力分析、欧拉角变换建立四旋翼无人…

2023.9.18 网络层 IP 协议详解

目录 IP协议 IPv4 32位 源IP 地址 / 32位 目的IP 地址 IP 地址管理 特殊 IP 路由选择 IP协议 IPv4 32位 源IP 地址 / 32位 目的IP 地址 基本知识&#xff1a; 在 IP 报头中一般表示为 32位 二进制整数日常生活中的 IP 一般将 32位 二进制整数&#xff0c;也就是 4字节 的二…

2023/9/19 -- C++/QT

作业 1> 登录框实现注册功能&#xff0c;将注册的结果放入文件中&#xff08;君子作业&#xff09; 2> 完成文本编辑器的保存工作 void Widget::on_saveBtn_clicked() {QString fileName QFileDialog::getSaveFileName(this,"另存为","./","…

036:vue导出页面生成pdf文件

第036个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…