抓取jsp网页源代码(这是注解和反射实现参数值的自动验证?严谨)
优采云 发布时间: 2022-01-17 07:30抓取jsp网页源代码(这是注解和反射实现参数值的自动验证?严谨)
首先不讲反射的知识,因为网上的资源太多了,注解的基础知识就不讲了。网上也有很多,貌似都是废话。让我们回到主题。今天的内容是通过自定义注释。而反射实现了参数值的自动校验,那我们为什么要做这个校验呢?其实我们前端会验证,数据库也会验证,那为什么还要在后台代码里验证呢?就个人而言,我认为这是一个严重的问题。首先前端是可以验证的,但是如果前端安全验证没有做好,那么你的数据接口就会被分析捕获。当然,如果你使用velocity/jsp/freemaker等模板引擎是无法捕获接口的。此时,如果你的接口被抓到了,我可以通过模拟你的接口参数随便提交数据。这时候接口中可能没有携带一些参数,这个参数可以从session中获取,可以防止直接访问数据接口被盗用。以数据库为例,如果主外键不为空,并且在建表时设置了最大长度类型,那么数据表在写入数据时也会报错。那么这算作两次验证。为什么我们需要在代码中进行验证?个人认为,第一是句子严谨,否则这是个bug,哈哈,第二,虽然前端和数据库可以算是两个验证,但是这样的验证并不安全。例如,有人写了一个注入攻击的js代码提交。三、这里的验证可以减少数据库的交互压力……
那么问题来了,为什么我们“通过java手动实现通过反射和自定义注解验证后台参数值”?,个人原因,一是为了少写代码,二是为了学习一些知识,三是喜欢假装一会儿,当然这不是很厉害的技术。言归正传,我们之前是如何验证的呢?
1、struts2的valid可以通过xml配置,在xml中描述规则和返回信息。这种方法比较麻烦,开发效率低。不推荐。
2、validation bean基于JSR-303标准开发,使用注解实现,非常方便,但这只是一个接口,没有具体实现。Hibernate Validator是一个独立于hibernate的包,可以直接引用。验证bean实现和扩展,功能更强大。实现图如下:
点击此处查看中文官方手册
3、oval 是一个可扩展的Java对象数据校验框架,校验规则可以通过配置文件、Annotation、POJO来设置。可以使用纯Java语言、JavaScript、Groovy、BeanShell等来编写规则。这次我就不过多解释了。
4、 Springboot验证器其实集成了Hibernatevalidator。主要是验证用户提交的数据的合理性,比如是否为空,密码长度是否大于6位,是否为纯数字等。方便在后台验证数据的有效性。
代码基本上是这样的
所以让我们自己实现
1.首先,创建一个自定义注解,如下图,我们先做一个邮箱验证,其他基本步骤同理。
2.二、写一个反射类进行验证
/**
* 注解验证方式
*
* @param bean 验证实体
* @返回
*/
@SuppressWarnings("未选中")
公共静态地图验证(对象 bean){
映射结果 = new HashMap();
result.put("消息", "验证通过");
result.put("结果", true);
类 cls = bean.getClass();
// 检查字段是否存在
尝试 {
// 获取实体字段集合
字段[] 字段 = cls.getDeclaredFields();
对于(字段 f:字段){
// 通过反射获取属性对应的值
f.setAccessible(true);
// 获取字段值
对象值 = f.get(bean);
// 获取字段上的注解集合
Annotation[] arrayAno = f.getAnnotations();
for(注解注解:arrayAno){
// 获取注解类型(注解类的Class)
类 clazz = annotation.annotationType();
// 获取注解类中的方法集
Method[] methodArray = clazz.getDeclaredMethods();
for(方法方法:methodArray){
// 获取方法名
字符串方法名 = 方法.getName();
// 过滤对错误提示方法的调用
if(methodName.equals("message")) {
继续;
}
// 初始化注解校验的方法处理类(我的处理方法卸载在这个类中)
对象 obj = ValidateUtil.class.newInstance();
// 获取方法
尝试 {
// 通过方法名获取方法
方法 m = obj.getClass().getDeclaredMethod(methodName, Object.class, Field.class);
// 调用这个方法
结果 = (Map)m.invoke(obj, value, f);
/* 如果验证结果有一个失败,则退出 */
if(result.get("result").equals(false)) {
结果.put(f.getName(), value);
返回结果;
}
} 捕捉(异常 e){
e.printStackTrace();
("找不到方法:"+methodName);
}
}
}
}
} 捕捉(异常 e){
e.printStackTrace();
(“验证错误”);
}
返回结果;
}
3.第三,我们写验证方法,这里我用一个正则来实现
4.写一个实体类进行验证,这里是我们刚刚写的测试
5.我们直接在main函数中测试。
6.输出结果,我通过了手机号,所以验证失败
那么这个过程就结束了,所以现在这是最简单的验证。之后,我们可以扩展它很多。比如我们要封装一个mvc框架,可以在controller层实现参数的接收封装。参数验证如下
这样就可以自动封装和验证参数。当然,其他的事情也可以通过注解和反射来完成,比如路由映射、权限验证、XSS攻击过滤、数据处理、aop的实现、数据表结构实体映射等,你可以自己做。试试看