爆破专栏丨SpringBoot2(9),网络安全常见面试题及答案

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

本章节我会利用另一种技术WebDataBinder,继续处理SpringBoot中的参数传递及数据绑定,并在本文中带大家实现自定义的属性编辑器,以及自定义参数校验器。

一. WebDataBinder简介

在进行代码实现之前,我们先来看看WebDataBinder是个什么东东!

1. WebDataBinder的由来

在Servlet中,有一个方法:request.getParameter(“paramName”) ,它会根据key返回一个String类型的数据,从而获取到前端传递过来的请求参数。

但是如果我们这样一个一个地去取出Web请求中的所有参数,就会很麻烦。我们知道Java中有对象的概念,那有没有办法将request中的请求参数都自动封装到一个Java对象中呢?为了解决这个问题,SpringMVC中就引入了WebDataBinder的概念。

2. WebDataBinder类关系

我们再来看看WebDataBinder的类关系图:

图片

3. WebDataBinder的作用

WebDataBinder的作用是从Web 请求中,把请求里的**参数**都绑定到对应的**JavaBean**上!

在Controller方法中的参数类型可以是基本类型,也可以是封装后的普通Java类型。若这个普通的Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数,而WebDataBinder则可以帮助我们实现从Request中取出请求参数并绑定到JavaBean中。

4. WebDataBinder工作机制

WebDataBinder用于绑定请求参数到指定的属性编辑器里。由于前台传到Controller里的值是String类型,当往Java Bean里设置这个值的时候,如果设置的这个属性是对象,SpringMVC就会去找到对应的编辑器editor进行转换,然后再设置进去!

SpringMVC自己提供了大量的editor编辑器实现类,诸如CustomDateEditor,CustomBooleanEditor,CustomNumberEd itor等,基本上够我们使用了。

图片

但在平时使用SpringMVC时,可能会碰到Java Bean中有Date类型的参数,表单中传来代表日期的字符串转化为日期类型,SpringMVC在默认时,是不支持这种类型转换的。此时我们就需要手动设置时间格式并在WebDateBinder上注册这个编辑器!

5. 示例代码

利用CustomDateEditor实现日期格式转换的示例代码,如下所示:

@InitBinder  
**public** **void** **bindingPreparation**(WebDataBinder binder) {  
  DateFormat dateFormat1 = **new** SimpleDateFormat("dd-MM-yyyy");  
  CustomDateEditor orderDateEditor = **new** CustomDateEditor(dateFormat1, **true**);  
  DateFormat dateFormat2 = **new** SimpleDateFormat("MMM d, YYYY");  
  CustomDateEditor shipDateEditor = **new** CustomDateEditor(dateFormat2, **true**);  
  binder.registerCustomEditor(Date.**class**, "**orderDate**", **orderDateEditor**);  
  binder.registerCustomEditor(Date.**class**, "**shipDate**", **shipDateEditor**);  
}

二. WebDataBinder实现过程

了解了上面的这些理论内容,接下来我就利用WebDataBinder实现参数的转换。

1. 创建Web项目

首先我们要创建一个Web项目,或者也可以直接在上一个项目的基础之上编写本案例代码,具体请参考之前的章节。

2. 创建User类

我们在项目中创建一个domain包,在该包下创建一个User实体类,里面有个日期类型的birthday字段。

**package** com.yyg.boot.domain;

**import** lombok.Data;

**import** java.util.Date;

/**
 * **@Description** Description
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/3/23
 */
@Data
**public** **class** **User** {

    **private** String name;

    **private** String password;

    **private** String email;

    **private** Date birthday;

}

3. Validator接口介绍

在使用Validator之前,我先介绍一下Validator接口。

  • Validator 是一个有着两个方法的接口;
  • boolean supports(Class<?> clazz) : 检验参数是否验证成功的实例类;
  • void validate(Object target, Errors errors) : 如果 suppo rts()方法返回真, targetobject 合法. Errors.reject Value() 方法用一个字段名注册错误信息。

4. 创建UserValidator验证类

我们创建一个validator包,在该包下面创建一个UserValidator验证类,在这里负责对前端传递过来的User类型参数进行必要的校验,判断用户名和密码是否符合规范。

**package** com.yyg.boot.domain;

**import** lombok.Data;

**import** java.util.Date;

/**
 * **@Description** Description
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/3/23
 */
@Data
**public** **class** **User** {

    **private** String name;

    **private** String password;

    **private** String email;

    **private** Date birthday;

}**package** com.yyg.boot.validator;

**import** com.yyg.boot.domain.User;
**import** org.springframework.stereotype.Component;
**import** org.springframework.validation.Errors;
**import** org.springframework.validation.ValidationUtils;
**import** org.springframework.validation.Validator;

/**
 * **@Description** Description
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/3/23
 */
@Component
**public** **class** **UserValidator** **implements** **Validator** {

    /**
     * 检验参数是否验证成功的实例类
     */
    @Override
    **public** **boolean** **supports**(Class<?> clazz) {
        //isAssignableFrom()方法是判断是否为某个类的父类,instanceof关键字是判断是否某个类的子类。
        **return** User.**class**.**isAssignableFrom**(**clazz**);
    }

    /**
     * 如果 supports() 方法返回真, target object 合法. Errors.rejectValue() 方法会用一个字段名注册错误信息;
     */
    @Override
    **public** **void** **validate**(Object target, Errors errors) {
        User user = (User)target;
        //配置字段验证信息
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "","Username is empty");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "", "Password is empty");
        
        //用户名长度不能小于5个字符
        **if** (user.getName().length()<5) {
            errors.rejectValue("name","", "Username length is less than 5");
        }
    }

}**package** com.yyg.boot.validator;

**import** com.yyg.boot.domain.User;
**import** org.springframework.stereotype.Component;
**import** org.springframework.validation.Errors;
**import** org.springframework.validation.ValidationUtils;
**import** org.springframework.validation.Validator;

/**
 * **@Description** Description
 * **@Author** 一一哥Sun
 * **@Date** Created in 2020/3/23
 */
@Component
**public** **class** **UserValidator** **implements** **Validator** {

    /**
     * 检验参数是否验证成功的实例类
     */
    @Override
    **public** **boolean** **supports**(Class<?> clazz) {
        //isAssignableFrom()方法是判断是否为某个类的父类,instanceof关键字是判断是否某个类的子类。
        **return** User.**class**.**isAssignableFrom**(**clazz**);
    }

    /**
     * 如果 supports() 方法返回真, target object 合法. Errors.rejectValue() 方法会用一个字段名注册错误信息;
     */
    @Override
    **public** **void** **validate**(Object target, Errors errors) {
        User user = (User)target;
        //配置字段验证信息
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "","Username is empty");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "", "Password is empty");
        
        //用户名长度不能小于5个字符
        **if** (user.getName().length()<5) {
            errors.rejectValue("name","", "Username length is less than 5");
        }
    }

}

5. 创建EmailValidator验证类

我们在validator包中,再创建一个EmailValidator验证类,判断用户的邮箱信息是否符合要求。

**package** com.yyg.boot.validator;

**import** com.yyg.boot.domain.User;
**import** org.springframework.stereotype.Component;
**import** org.springframework.validation.Errors;
**import** org.springframework.validation.ValidationUtils;
**import** org.springframework.validation.Validator;

/**
 * **@Description** Description
 * **@Author** 一一哥Sun


### 给大家的福利


**零基础入门**


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


![](https://img-blog.csdnimg.cn/img_convert/95608e9062782d28f4f04f821405d99a.png)


同时每个成长路线对应的板块都有配套的视频提供:


![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a91b9e8100834e9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
![img](https://img-blog.csdnimg.cn/img_convert/fe6a991720fbf4fbc8c83e6d1d2f374d.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

9291cfcf1695d8cd42.png#pic_center)


因篇幅有限,仅展示部分资料

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)**
[外链图片转存中...(img-FQguC9YJ-1713623235812)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值