经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
axios前端加密通讯的处理
来源:cnblogs  作者:锈剑独孤  时间:2020/12/28 9:51:49  对本文有异议

axios前端加密通讯的处理

今天谈一谈前段时间,项目中遇见的前端axios加解密的处理。

先谈谈项目前景,因为安全的要求,所以我们要把前端所有的请求都得加密与服务端应用进行通讯,当然服务端的响应也是加密的,前端也需要对应得解密。

一、拦截器InterceptorManager

遇见这个需求,或许从axios文档中,我们第一时间想到的就是InterceptorManager。

  1. axios.interceptors.request.use(req => {
  2. // todo 加密
  3. })
  4. axios.interceptors.response.use(rsp => {
  5. // todo 解密
  6. })

但是现在需求升级了,我们要求前端根据服务端的响应状态码自动切换加密或者明文通迅。

我们再回过头看看InterceptorManager还合适么?

当然这个需求在一般情况下是比较少见的,但是确实存在不是么?接下来我们看看方法2

二、代理axios.request方法。

可以实现,但是还是略为复杂。

  1. import Axios from 'axios/lib/core/Axios'
  2. import axiosBind from 'axios/lib/helpers/bind'
  3. import axiosUtils from 'axios/lib/utils'
  4. // todo 导入 加密的securityAxios, 正常的defaultAxios。
  5. // todo 导入 全局变量isSecurity控制是否需要加密
  6. async function requestProxy(...args) {
  7. if(isSecurity){
  8. return await securityAxios.request(...args)
  9. }
  10. return await defaultAxios.request(...args)
  11. }
  12. function createInstance(defaultConfig) {
  13. const context = new Axios(defaultConfig);
  14. Object.defineProperty(context, 'defaults', {
  15. get() {
  16. return isSecurity ? securityAxios.defaults : defaultAxios.defaults;
  17. },
  18. })
  19. context.request = requestProxy;
  20. var instance = axiosBind(requestProxy, context);
  21. axiosUtils.extend(instance, Axios.prototype, context);
  22. axiosUtils.extend(instance, context);
  23. return instance;
  24. }
  25. const axiosInstance = createInstance();
  26. axiosInstance.axios = axiosInstance;
  27. export default axiosInstance;

这种方式看看就好了,当时是半路接过来某项目选择了这种方式简单优化下。

三、包装自定义的fetch方法

  1. export function fetch(...args){
  2. if(isSecurity){
  3. return securityAxios(...args);
  4. }
  5. return defaultAxios(...args);
  6. }

此方法相对上面的方法,实现更方便,但是如果项目中使用的是axios的实例去操作,则这种方式修改的地方太大了。

四、自定义Adapter

大概这种方式是最优解了。

  1. import axios from 'axios'
  2. export default ((defaultAdapter) => {
  3. function security(cfg){
  4. // todo 构建新的加密后的config;
  5. return newCfg;
  6. }
  7. function unsecurity(rsp){
  8. // todo 解密返回的加密串;
  9. return newRsp;
  10. }
  11. return function securityAdapter(config){
  12. const securityConfig = security(config)
  13. const resp = defaultAdapter(securityConfig)
  14. return unsecurity(resp)
  15. }
  16. })(axios.default.adapter)
  1. import securityAdapter from './securityAdapter'
  2. const securityAdapter = axios.create({
  3. adapter: securityAdapter,
  4. })
  5. // todo

总结

以上几种方式,都是我实际项目中,遇见的实现方式,或是自己的处理方式。

  • 方法一,不够解藕,拦截器很容易过于复杂;
  • 方法二,过于繁所;
  • 方法三,需要修改现有的代码;
  • 方法四,暂时来看是最合适的

需求继续升级,如果,前端加密后,发现后端需要接收明文,切换后,需要重新请求,那么哪种方式修改起来最方便呢?

原文链接:http://www.cnblogs.com/m-meng/p/14186948.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号