抓取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的实现、数据表结构实体映射等,你可以自己做。试试看

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线