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

【续上集】 开源项目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可以

不填写,允许为空。

如果不指定属性的groups,则默认属于javax.validation.groups.Default.class分组,可以通

过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,通过注解,实现多数据源

阿里p7专家:年薪50w+ 只因做到了这几点......

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

原文发布于微信公众号 - java思维导图(java-mindmap)

原文发表时间:2018-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android先生

Android中极简的js与java的交互库-SimpleJavaJsBridge

最近接触android中js与java交互的东西很多,当然它们之间的交互方式有几种,但是我觉得这几种交互方式都存在一定的不足,这是我决定编写SimpleJava...

1133
来自专栏Java架构

前沪江高级架构师学习笔记分享:分布式框架设计与实现

1936
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第三十一天 WebService学习【悟空教程】

简单的网络应用使用单一语言写成,它的唯一外部程序就是它所依赖的数据库。大家想想是不是这样呢?

1754
来自专栏菩提树下的杨过

[biztalk笔记]-1.Hello World!

开始接触biztalk了,这个东西感觉不象linq,silverlight等具体的技术好学,看了几天文档,也跑通了一些小示例,但是仍然觉得毫无感觉,只大概的知道...

2146
来自专栏智能算法

Python学习(九)---- python中的线程

原文地址: https://blog.csdn.net/fgf00/article/details/52773459 编辑:智能算法,欢迎关注! 上期我们一起学...

1482
来自专栏Java帮帮-微信公众号-技术文章全总结

Python常见面试题【悟空教程】

1.MySQL 数据库总结 MySQL 可以建多少个数据库,理论上是没有限制的,每一个数据库可以有上亿的对象,但是一般基于硬件要求、效率问题一般不超过64个, ...

1462
来自专栏JackeyGao的博客

Celery用户手册 - Tasks

Tasks是Celery 应用的构建块。事实上Celery应用是由一个或多个Task拼装组成的。

1443
来自专栏后台全栈之路

基于汇编的 C/C++ 协程 - 实现

将 libco 和 libevent 两者的功能糅合起来,所以我把我的工程,命名为 libcoevent,意为 “基于 libevent 的同步协程服务器编程框...

4992
来自专栏Puppeteer学习

一步一步学Vue(七)

1533
来自专栏C/C++基础

Linux命令(9)——tcpdump命令

tcpdump是一款类Unix/Linux环境下的抓包工具,允许用户截获和显示发送或收到的网络数据包。tcpdump 是一个在BSD许可证下发布的自由软件。

1143

扫码关注云+社区