SpringMVC之JSR303和拦截器

2023-09-12 13:32:21

目录

一.JSR303

二.JSR常用的注解

三.JSR快速入门

四.拦截器

   ⭐⭐⭐拦截器和过滤器有什么不一样,或者它们的区别是什么??

五.拦截器快速入门--登录的案例


一.JSR303

        JSR 303 是 Java 规范的一部分,全称为 Bean Validation 框架。它定义了一组基于标注的验证注解,用于验证 Java 对象的属性值的合法性。JSR 303 可以用于验证用户输入、数据持久化前的数据校验等场景。

        JSR 303 是一种后端验证(服务器端验证)的解决方案。它在后端应用程序中用于验证用户提交的数据或其他对象的合法性。

        与后端验证相对应的是前端验证(客户端验证),前端验证是在用户浏览器中进行的验证过程,通过JavaScript等前端技术实现。前端验证主要用于提供无效请求即时反馈和减少的网络流量,但不能完全依赖前端验证来确保数据的安全性和合法性。因此,后端验证仍然是必要的,并且JSR 303 提供了一种便捷的后端验证解决方案。所以我们一般都是前端一套校验,后端在一套校验,这样安全性就能够大大得到提升了。

二.JSR常用的注解

        这些注解都是别人已经写好的了,我们直接用就行,但是如果要是我们要用的注解没有怎么办?之后我会和大家讲解如何去制作一个注解,自定义注解

注解说明
@Null用于验证对象为null
@NotNull用于对象不能为null,无法查检长度为0的字符串
@NotBlank只用于String类型上,不能为null且trim()之后的size>0
@NotEmpty用于集合类、String类不能为null,且size>0。但是带有空格的字符串校验不出来
@Size用于对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length用于String对象的大小必须在指定的范围内
@Pattern用于String对象是否符合正则表达式的规则
@Email用于String对象是否符合邮箱格式
@Min用于Number和String对象是否大等于指定的值
@Max用于Number和String对象是否小等于指定的值
@AssertTrue用于Boolean对象是否为true
@AssertFalse用于Boolean对象是否为false

三.JSR快速入门

        首先,我们要先导入JSR的pom依赖

<!-- 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>

        在实体类的属性上面写上如果为空就提示的信息语句

        接下来需要校验上方的注解

    //    给数据添加服务端校验
    @RequestMapping("/valiAdd")
    public String valiAdd(@Validated Struts struts, 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.strutsBiz.insertSelective(struts);
            return "redirect:list";
        }
        return "edit";
    }

        接下来需要设置提示词

        这样一个JSR的注解判断就完成了,接下来我们看看结果吧!

 

四.拦截器

        拦截器(Interceptor)是一种在软件系统中用于拦截、处理和转发请求和响应的组件或模块。它可以在请求到达目标处理程序之前或响应返回给客户端之前对其进行处理。

        以下是拦截器的主要作用:

  1. 身份验证和权限控制:拦截器可以用来验证请求的身份和权限,例如跳转到登录页面或拒绝访问。

  2. 日志记录和跟踪:拦截器可以记录请求和响应的详细日志,包括请求的参数、执行时间、错误信息等。这有助于开发人员在系统中追踪问题和进行故障排除。

  3. 缓存和性能优化:拦截器可以实现结果缓存,将频繁请求的结果缓存在内存或其他存储中,减少对后端资源的访问。这有助于提高系统的性能和响应速度。

  4. 异常处理:拦截器可以捕获系统中的异常,例如返回自定义错误页面或发送错误报告。

  5. 请求和响应的处理和修改:拦截器可以对请求和响应进行修改和处理,例如添加、删除或修改请求参数、设置响应头、处理响应结果等。

   ⭐⭐⭐有人可能会问,拦截器和过滤器有什么不一样,或者它们的区别是什么??

  • 过滤器(filter)

    1.filter属于Servlet技术,只要是web工程都可以使用

    2.filter主要由于对所有请求过滤

    3.filter的执行时机早于Interceptor

  • 拦截器(interceptor)

    1.interceptor属于SpringMVC技术,必须要有SpringMVC环境才可以使用

    2.interceptor通常由于对处理器Controller进行拦截

    3.interceptor只能拦截dispatcherServlet处理的请求

五.拦截器快速入门--登录的案例

        所谓拦截器,首先当然是要写一个拦截器方法

package com.yinzi.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author yinzi
 * @create 2023-09-12 13:02
 */
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public 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;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

        接着,在spring-mvc中进行配置‘

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

        写一个登录的方法

package com.yinzi.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * @author yinzi
 * @create 2023-09-12 13:03
 */
@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:/list";
    }

    @RequestMapping("/logout")
    public String logout(HttpServletRequest req){
        req.getSession().invalidate();
        return "redirect:/list";
    }
}

      最后,就是前端代码


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登录界面</h1>
<form action="/login" method="post">
    用户名字:<input name="uname">
    <input type="submit">

</form>
</body>
</html>

 结果:

它会经过拦截器进行判断

        好啦,今天的分享就到这啦!!!

更多推荐

MySQL常见面试题(四)

😀前言在进行数据库设计和优化的过程中,我们不得不面对多样化的技术和方法来确保我们的系统可以高效、可靠地运行。为了深入了解和掌握这个领域,我们将讨论InnoDB存储引擎的多种索引类型,以及索引的不同方面和分类。我们还将深入探讨为什么通常推荐使用自增列作为主键,以及主键和唯一键之间的区别。最后,我们将提供一系列可用于SQ

activiti流程变量

activiti流程变量定义流程变量在Activiti中是一个十分重要的角色,流程运转时,需要靠流程变量,业务系统和activiti结合时少不了流程变量,流程变量就是activiti在管理工作流时根据管理需要而设置的变量。比如:在出差申请流程流转是如果出差天数大于三天则需要总经理审批,否者只需要认识审批,出差天数就可以

AI&DAO,将会引领我们走向何方?

人工智能(AI)和分布式自治组织(DAO)都是区块链赛道的热门项目之一,他们看似在不同的领域独立发展,然而,它们之间也存在着巨大的协同潜力。未来,AI有望成为推动DAO发展的重要动力,同时,DAO也可成为AI的最佳实验场所。DAO的下一波浪潮可能是AIDAO。释放生产力的未来首先,让我们来思考一下,AI如何在DAO中释

创建一个简单的外卖订餐系统

在今天的快节奏生活中,外卖订餐系统已经成为了人们日常生活中不可或缺的一部分。这些系统通过在线点餐和配送服务,为用户提供了便捷的用餐体验。在本文中,我们将创建一个简单的外卖订餐系统,使用Python和Flask框架构建后端,以及HTML、CSS和JavaScript构建前端。技术栈我们将使用以下技术栈来构建这个外卖订餐系

【基本数据结构 三】线性数据结构:栈

学习了数组和链表后,再来看看第三种线性表结构,也就是栈,栈和后边讲的队列一样是一种受限的线性表结构,正是因为其使用有限制,所以对于一些特定的需要操作可控的场合,受限的结构就非常有用。栈的定义我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。栈的结构后进者先出,

Rust认识所有权(4)

认识所有权1.认识所有权2.什么是所有权?2.1程序运行管理运行的方式2.2栈(Stack)和堆(Heap)1.栈(Stack)2.堆(Heap)2.3所有权规则2.4变量作用域2.4String类型2.5内存与分配1.以String类型为参考2.变量与数据交互的方式(一):移动2.1String版本3.变量与数据交互

Linux内核源码分析 (B.4) 深度剖析 Linux 伙伴系统的设计与实现

Linux内核源码分析(B.4)深度剖析Linux伙伴系统的设计与实现文章目录1\.伙伴系统的核心数据结构2\.到底什么是伙伴3\.伙伴系统的内存分配原理4\.伙伴系统的内存回收原理5\.进入伙伴系统的前奏5.1获取内存区域zone里指定的内存水位线5.2检查zone中剩余内存容量是否满足水位线要求5.3内存分配成功之

Vision Transformer(ViT)论文解读与代码实践(Pytorch)

VisionTransformerVisionTransformer(ViT)是一种基于Transformer架构的神经网络模型,用于处理计算机视觉任务。传统的计算机视觉模型如卷积神经网络(CNN)在处理图像任务时取得了很大的成功,但CNN存在一些局限,例如对于长距离依赖的建模能力较弱。ViT通过引入Transform

Windows下SpringBoot连接Redis的正确使用姿势

1.安装Redis1.1通过wsl安装redis参考官方安装文档,需要在wsl2上安装redis服务。注意我们启动redis的方式:Firstway:采用官方文档的方式:sudoserviceredis-serverstart,关闭wsl后redis在后台仍能运行,可以sudoserviceredis-serverst

【web开发】11、文件的上传

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、文件上传二、批量上传三、案例:混合数据(form上传)四、启用media五、案例:混合数据(Modelform上传)小结提示:以下是本篇文章正文内容,下面案例可供参考一、文件上传图片文件上传:在form里添加enctype=“multipart

上海长宁来福士P2.5直径4米无边圆形屏圆饼屏圆面屏圆盘屏平面圆屏异形创意LED显示屏案例

长宁来福士广场是一个大型广场,坐落于上海中山公园商圈的核心区域,占地逾6万平方米,其中地上总建筑面积近24万平方米,总投资额约为96亿人民币。LED圆形屏是根据现场和客户要求定制的一款异形创意LED显示屏,进行文字、图片、视频等信息播放,应用在舞台、演播室、酒店、机场、路灯广告等LED场所,根据直径要求,可做成户外室内

热文推荐