开源项目renren-fast解读,让java不再难懂(二)

3、安全防范模块-预防xss攻击和sql注入

XSS

1、百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

2、它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。

Filter过滤器

Filter过滤器是一种比较实用的东西,可以过滤不良信息,对提交来的信息进行处理。是Request和Response之间的传输纽带。

HttpServletRequestWrapper

Filter是这样一种Java对象,它能能在request到达servlet的服务方法之前拦截HttpServletRequest对象,而在服务方 法转移控制后又能拦截HttpServletResponse对象。

你可以使用filter来实现特定的任务,比如验证用户输入,以及压缩web内容。但HttpServletRequest对象的参数是不可改变的,这极大地缩减了filter的应用范围。至少在一半的时间里,你希望可以改变准备传送给 filter的对象。

幸运的是,尽管你不能改变不变对象本身,但你却可以通过使用装饰模式来改变其状态。

所以:在Filter中修改后台Controller中获取到的HttpServletRequest中的参数,只需要在Filter中自定义一个类继承于HttpServletRequestWrapper,并复写getParameterNames、getParameter、getParameterValues等方法即可。

方法:

要创建HttpServletRequest的装饰类,你需要继承HttpServletRequestWrapper并且覆盖你希望改变的方法。

ServletRequest 抽象组件

HttpServletRequest 抽象组件的一个子类,它的实例被称作“被装饰者”

ServletRequestWrapper 一个基本的装饰类,这里是非抽象的

HttpServletRequestWrapper 一个具体的装饰者,当然这里也继承了HttpServletRequest这个接口,是为了获取一些在ServletRequest中没有的方法

ModifyParametersWrapper 同样是 一个具体的装饰者(PS:我自定义的一个类)

防XSS注入流程:

1、自定义包装类XssHttpServletRequestWrapper,继承HttpServletRequestWrapper,重写getInputStream(),getParameter(String name),getParameterValues(String name)等方法。

2、自定义过滤器XssFilter,过滤所有链接,这样所有方法中request.getParameter();就能调用自定义包装类里面重写的方法,进行xss过滤。

4、redis的使用

官方给出的redis使用原则:

1. 查询数据的时候,尽量减少DB查询,DB主要负责写数

2. 尽量不使用 LEFt JOIN 等关联查询,缓存命中率不高,还浪费内存

3. 多使用单表查询,缓存命中率最高

4. 数据库 insert 、 update 、 delete 时,同步更新缓存数据

5. 合理运用Redis数据结构,也许有质的飞跃

6. 对于访问量不大的项目,使用缓存只会增加项目的复杂性。

Redis切面处理类RedisAspect,使用切面定义是否启用redis缓存。

原理:

ProceedingJoinPoint:用于环绕通知,使用proceed()方法来执行目标方法,当不打开redis缓存时候,跳过RedisUtils的所有方法执行。

RedisUtils,redis操作的工具类

SysConfigRedis,系统配置缓存操作的工具类

5、swagger2的使用

SwaggerConfig中开启swagger2配置的支持。app模块使用swagger的注解。

6、系统日志处理

项目逻辑:

自定义方法级别的注解SysLog,在需要说明操作日志的方法上添加此注解,并说明操作的意义。

@SysLog("保存菜单")

同时编写切面处理类SysLogAspect,使用SysLog作为切入点,监测注解的方法。并把操作内容保存到数据库中。

7、数据校验

后端效验使用的是Hibernate Validator校验框架。且自定义ValidatorUtils工具类,用来效验数据。

通过分析上面的代码,我们来理解Hibernate Validator校验框架的使用。

其中,username属性,表示保存或修改用户时,都会效验username属性; 而password属

性,表示只有保存用户时,才会效验password属性,也就是说,修改用户时,password可以

不填写,允许为空。

过ValidatorUtils.validateEntity(user)进行效验。

项目逻辑:

首先定义分组,根据实际情况,可以分为添加组AddGroup和修改组UpdateGroup等。

在实体上添加hibernate.validator规则注解@NotBlank、@Email等,并分组。

编写规则校验工具类ValidatorUtils。校验出有不符合规则的内容抛出自定义异常RRException

再保存、更新等操作中使用ValidatorUtils.validateEntity(user, AddGroup.class);校验实体规则情况。

8、多数据源

多数据源的应用场景,主要针对跨多个MySQL实例的情况;如果是同实例中的多个数据库,则没必要使用多数据源。

实现数据源切换的功能就是自定义一个类扩展AbstractRoutingDataSource抽象类,其实该相当于数据源DataSourcer的路由中介,可以实现在项目运行时根据相应key值切换到对应的数据源DataSource上。

从源码可以看出AbstractRoutingDataSource继承了AbstractDataSource并实现了InitializingBean,AbstractRoutingDataSource的getConnection()方法调用了determineTargetDataSource()的该方法,这里重点看determineTargetDataSource()方法代码,方法里使用到了determineCurrentLookupKey()方法,它是AbstractRoutingDataSource类的抽象方法,也是实现数据源切换要扩展的方法,该方法的返回值就是项目中所要用的DataSource的key值,拿到该key后就可以在resolvedDataSource中取出对应的DataSource,如果key找不到对应的DataSource就使用默认的数据源。

自定义类扩展AbstractRoutingDataSource类时就是要重写determineCurrentLookupKey()方法来实现数据源切换功能。

实现多数据源:

步骤1,在spring boot中,增加多数据源的配置

步骤2,扩展Spring的AbstractRoutingDataSource抽象类,

AbstractRoutingDataSource中的抽象方法determineCurrentLookupKey是实现多数据

源的核心,并对该方法进行Override

步骤3,配置DataSource,指定数据源的信息

步骤4,通过注解,实现多数据源

--- 解读完毕,欢迎点赞评论 ---

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180526A0JA6E00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券