背景
前端使用vue(axios),后台使用的spring boot,为了保证数据传输的安全,防止爬虫等。
需要把前端请求参数加密,后台将入参解密,再把出参加密,前端拿到响应后进行解密。
前端
前端使用的axios封装的http请求,使用拦截器对请求加密,对响应解密。
1 | // 请求拦截 |
其中util.vue
:
1 | import CryptoJS from 'crypto-js'; |
后台
在filter中对RequestBody进行解密,并把解密后的json按照名值对放入parameter中,以便controller中获取参数时免写@RequestBody注解。
SecretRequestFilter.java
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32package com.kangyonggan.demo.filter;
import com.kangyonggan.demo.util.SecretRequestWrapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author kangyonggan
* @since 2019-04-15
*/
@Configuration
public class SecretRequestFilter extends OncePerRequestFilter {
@Value("${app.aes-key}")
private String aesKey;
@Value("${app.aes-iv}")
private String aesIv;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(new SecretRequestWrapper(request, aesKey, aesIv), response);
}
}
其中SecretRequestWrapper.java
:
1 | package com.kangyonggan.demo.util; |
在ResponseBodyAdvice中对响应进行统一加密,ResponseAdvice.java
:
1 | package com.kangyonggan.demo.advice; |
其中@Secret注解用来决定是否对响应进行加密,定义如下:
1 | package com.kangyonggan.demo.annotation; |
Aes加密工具代码如下:
1 | package com.kangyonggan.demo.util; |
附
如果使用swagger来生成接口文档给前端童鞋使用,当我们队接口进行了统一加密解密之后,
swagger-ui的那一套界面就废了,因为他并不没有实现加密解密,因此我们需要重写一套自己的swagger-ui,
实现的思路也比较简单,swagger会把所有的接口信息生成一个json信息,接口地址是:http://localhost:8080/v2/api-docs。
我们拿到所有接口的json信息之后,可以画一个简单的界面,列出所有的接口信息,然后实现自己的”try it out”,这时就可以对所有的请求进行加解密了。
也可以在github上搜索swagger-ui,clone到本地后对请求响应进行加解密,这样就不用自己画ui了。