上一篇主要讲了整个项目的子模块及第三方依赖的版本号统一管理维护,数据库对接及缓存(Redis)接入,今天我来说说过滤器配置及拦截设置、接口安全处理、AOP切面实现等。作为电商项目,不仅要求考虑高并发带来的压力,更要考虑项目的安全稳固及可扩展。首先我们说说接口安全。

一,接口安全

说起安全,这似乎是IT行业一直以来的重点话题。实际真正的项目安全,更多的是运维工程师(安全专家)从网络和服务器层面保护。目前基本每个大的互联网公司都有一个安全团队(推荐大家了解下阿里安全专家吴翰清)。今天我要说的只是接口安全防护(如何防止恶意请求、数据篡改),这也是好多中高级开发者经常在面试中被问到的话题。首先我说说思路,目前接口安全的基本防护方案就是:令牌+签名,也有采用非对称加密密文传输,https协议传输等方案。

1,令牌+签名

这是今天要说的重点,令牌+签名到底怎么实现接口安全请求呢?

签名实现:最简单的实现就是先把你要请求的参数转化为字符串,再通过MD5给这个字符串加密,然后将加密后的字符串作为签名参数。Java后台再写一个过滤器,当请求进入过滤器,先取出参数在过滤器里按照这个规则生成校验。但在实际开发中,这种方式很容易被他人模仿请求你的接口,那怎么办呢?其实很简单,给MD5生成的那个签名“撒盐”,也就是给那个签名的字符串里的某个或某些片段植入随机字符串,然后在后台过滤器校验时,把这个片段内容取出替换后台生成的参数签名里的那个片段再对比校验。

令牌实现:令牌也就是我们常说的token,在用户登录后,生成一个唯一的token,并将这个token作为key,登录者信息(一般都是封装的登录实体类)作为值存到Redis中,并将token返回给用户。用户要访问其他接口,那你就必须带token,在过滤器检验完签名后,然后取到请求参数里的token,再查询Redis检验Token是否有效,校验不通过直接拦截返回。

部分代码片段

注意,这里都是以封装的实体和工具类处理返回。返回实体及返回工具类代码如下:

自定义异常枚举类:

注意:过滤器的一定要实现Filter接口,并添加注解

@WebFilter(filterName = "myFilter",urlPatterns = {"/*"}),如:

@WebFilter(filterName = "myFilter",urlPatterns = {"/*"})
public class MyFilter implements Filter {

然后重写doFilter()方法。

2,非对称密文传输

这个方案实现起来很简单,可以先用RSA生成一对密钥(公钥何私钥),服务端保存私钥,公钥给要访问的客户端,客户端在请求接口时,把参数用RSA公钥加密,服务端接收到客户端请求传入的密文,用自己的私钥解密。这样就算有人获取到你的请求密文,甚至获取到客户端的公钥,那也没用,解不开,哪有人说了,如果拿到公钥了,就可以随意请求你的接口了。哪有你想的那么简单,后台可以在过滤器再加个校验签名不就解决了。对一般的接口,是没必要使用非对称密文传输的,加密解密需要时间开销,所以针对不同的业务场景,选择合适自己的方案。

3,令牌+签名方案测试验证

这里我启动服务测试一下,先在启动类里添加包扫描,然后启动服务测试。

在启动服务前,已写好的接口(用户的添加和登录接口)。

参数不带token和签名请求添加用户接口。

参数里随机添加签名(未按约定规则生成)请求接口。

参数里的签名按规则生成并发请求,这时开始验证token。

那么我先登录,获取token再发起请求。

再看看数据库。

二,AOP切面实现

这里用Aop主要实现日志及异常处理,首先我们在接口层(lyn-web)创建一个Aop的切面类,如下:

定义好切面,然后写前置通知,后置通知,环绕通知。

前置通知主要打印了请求接口、IP、接口请求方式等信息,环绕通知抓取了接口的响应时间和异常处理,后置通知打印了相应的参数。接下来我将使用Aop实现一些其他功能。

三,防SQL注入实现

先写一个非法字符检验工具类:

然后在AOP里写一个参数检查方法:

再在环绕通知里执行访问接口前操作执行检查方法

测试,参数带sql注入关键词(Drop  user_info)发起请求。

看打印的日志:

那我们去掉去掉非法关键词再发起请求:

再看看日志:

添加成功的数据库数据:

推荐阅读:

Spring Boot实现分布式微服务开发实战系列(三)

Spring Boot实现分布式微服务开发实战系列(二)

Spring Boot实现分布式微服务开发实战系列(一)

下期文章:深入介绍项目的配置,优化相关,以及缓存安全防范,Kafka的对接等内容。

获取项目源代码,请扫码关注公众号,并发送Springboot获取。

SpringBoot微服务电商项目开发实战 --- api接口安全算法、AOP切面及防SQL注入实现的更多相关文章

  1. SpringBoot微服务电商项目开发实战 --- Redis缓存雪崩、缓存穿透、缓存击穿防范

    最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容. 系列(一):主要说了 ...

  2. SpringBoot微服务电商项目开发实战 --- 模块版本号统一管理及Redis集成实现

    上一篇文章总结了基于SpringBoot实现分布式微服务下的统一配置.分环境部署配置.以及服务端模块的分离(每一个提供者就是一个独立的微服务).微服务落地.Dubbo整合及提供者.消费者的配置实现.本 ...

  3. SpringBoot微服务电商项目开发实战 --- 分布式文件系统实现

    SpringBoot分布式开发系列文章已经持续了一段时间了,每一篇都有核心内容讲给大家.比如:分环境部署配置及服务端口号统一配置,子模块版本号管理及第三方jar依赖管理,单点登录实现,接口安全(签名+ ...

  4. SpringBoot微服务电商项目开发实战 --- 全局异常处理

    上一篇文章讲了Redis缓存的安全防范及Kafka的接入及消息实现,今天接着前面的内容基础说说项目的优化和基础配置,今天要讲的内容主要是Spring Boot项目中的全局异常处理.为什么要做这件事呢? ...

  5. SpringBoot微服务电商项目开发实战 --- Kafka集成接入

    kafka作为消息中间件的一款产品,她比较轻量级,在吞吐量方面很优秀,默认消息持久化到硬盘当中 168小时=7天,log.retention.hours=168,比较适合来做运营的统计.其他的不多讲, ...

  6. Spring Boot微服务电商项目开发实战 --- 分布式开发要避的那些坑

    今天已经进入第七讲了,整个微服务架构的搭建工作也基本完成.那到目前为止究竟使用了那些技术及实现了什么功能呢?我们先回顾一下. 使用的技术:SpringBoot.Dubbo.Zookeeper.Redi ...

  7. Spring Boot微服务电商项目开发实战 --- 基础配置及搭建

    根据SpringBoot实现分布式微服务项目近两年的开发经验,今天决定开始做SpringBoot实现分布式微服务项目的系列文章,帮助其他正在使用或计划使用SringBoot开发的小伙伴们.本次系列文章 ...

  8. Spring Boot微服务电商项目开发实战 --- 多环境部署配置、端口号统一配置及Dubbo提供者消费者实现

    昨天已经搭建好了SpringBoot基于Maven的基础父子级项目,今天开始进入项目分模块及分布式实现.首先我们基于昨天的项目,在父级工程下建lyn-sys,lyn-customer,lyn-good ...

  9. Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构

    Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...

随机推荐

  1. An end-to-end TextSpotter with Explicit Alignment and Attention

     An end-to-end TextSpotter with Explicit Alignment and Attention 论文下载:http://cn.arxiv.org/pdf/1803.0 ...

  2. 1 JAVA语言的特点

    1.可移植性 通过先将java文件编译成字节码,再由特定平台的JVM转义为机器码,使得JAVA语言具有,编写一次,到处执行的特点.可移植性好. 2.面向对象的编程 面向对象编程的良好实现.有良好的面向 ...

  3. 小白学 Python 爬虫(8):网页基础

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  4. Java异常处理只有Try-Catch吗?

    今天,我们将讨论一个非常重要的主题-Java 中的异常处理.尽管有时可能会对此主题进行过多的讨论,但并非每篇文章都包含有用且相关的信息. Java 中最常见的异常处理机制通常与 try-catch 块 ...

  5. NLP 语义相似度计算 整理总结

    更新中 最近更新时间: 2019-12-02 16:11:11 写在前面: 本人是喜欢这个方向的学生一枚,写文的目的意在记录自己所学,梳理自己的思路,同时share给在这个方向上一起努力的同学.写得不 ...

  6. linux中Nginx安装

    linux中Nginx安装 编译安装 ​ Nginx的优点太多,这里不再赘述,详情请看这篇博客深入理解nginx. ​ Nginx的安装有rpm包安装.编译安装和docker安装.本文将介绍编译安装方 ...

  7. unicode和utf-8编码区别

    以前使用Python2,一直为中文烦恼,也不知道为什么开头就要声明#coding=utf-8,后来用了Python3,发现就不用这样了,还是想彻底弄懂下这是为什么. 先讲asc码  每个 ASC码占一 ...

  8. lvm_lv_extend

    根分区lv扩容 xfs格式 neokylinV7.0 [root@localhost ~]# fdisk /dev/vda 欢迎使用 fdisk (util-linux 2.23.2). 更改将停留在 ...

  9. 利用scatter()绘制颜色映射的二次方曲线

    程序如下: import matplotlib.pyplot as plt x_value = list(range(1, 1001)) y_value = [x**2 for x in x_valu ...

  10. mysql免密登录和修改密码

    (1)停止mysql服务      /etc/init.d/mysqld   stop (2)跳过密码验证      mysqld_safe  --skip-grant-tables  & ( ...