一、 接口方式

接口调用采用http协议,rest请求方式;

二、 接口安全

接口安全采用Json web token (JWT)机制,基于token的鉴权机制.

1. 机制说明

基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。

2. 基本流程

流程上是这样的:

(1) 用户使用用户名密码来请求服务器

(2) 服务器进行验证用户的信息

(3) 服务器通过验证发送给用户一个token

(4) 客户端存储token,并在每次请求时附送上这个token值(存在head里的参数X-AUTH-TOKEN)

(5) 服务端验证token值,并返回数据

 

3. 优点

  • 因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
  • 因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
  • 便于传输,jwt的构成非常简单,字节占用很小,所以它是非常便于传输的。
  • 它不需要在服务端保存会话信息, 所以它易于应用的扩展

4. 安全相关

  • 不应该在jwt的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
  • 保护好secret私钥,该私钥非常重要。
  • 如果可以,请使用https协议

三、 缓存配置

JWT 验证token采用redis进行缓存,

redis配置文件:src/main/resources/redis.properties

修改redis对应的IP和端口。

  1. #redis
  2. redis.host=124.206.91.99
  3. redis.port=6379
  4. redis.pass=
  5. redis.adapter.maxIdle=100
  6. redis.adapter.minIdle=10
  7. redis.adapter.testOnBorrow=true
  8. redis.adapter.testOnReturn=true
  9. redis.adapter.testWhileIdle=true
  10. redis.adapter.numTestsPerEvictionRun=10
  11. redis.adapter.timeBetweenEvictionRunsMillis=60000

四、 接口说明

    注意:访问除【鉴权TOKEN接口】以外的接口时,都需要访问用户拥有对接口的访问权限,如无权限,将直接返回如下信息:

  1. {"message":"您没有该接口的权限!","data":null,"ok":false,"respCode":"-1"}

1. 鉴权TOKEN接口

描述

根据用户名和密码获取TOKEN。

访问地址

http://域名/rest/tokens

访问方式

GET

参数

参数名

数据类型

是否必须

示例值

默认值

描述

username

String

Y

“admin”

用户名

password

String

Y

“123456”

密码

返回值

成功时,直接返回token字符串。

失败时,直接返回用户账号密码错误!

校验规则

请求示例

请求地址:http://域名/rest/tokens

  1. {
  2. "username":"admin",
  3. "password":"123456"
  4. }

返回示例

成功案例:

  1. eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4YThhYjBiMjQ2ZGM4MTEyMDE0NmRjODE4MTk1MDA1MiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU0NDE4fQ.tnILZEivS-6YOX9uqsnCHygh7-XrG_-Sj8vLslNGkdQ
  2. 失败案例:
  3. 用户账号密码错误!

2. 创建黑名单信息接口

描述

创建黑名单信息接口,黑名单为单表。

访问地址

http://域名/rest/tsBlackListController

访问方式

POST

参数(详见excel)

参数名

数据类型

是否必须

示例值

默认值

描述

ip

String

Y

“192.168.1.1”

......

……省略信息其他字段……

返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(NULL)

ok

状态

校验规则

1. 接口中涉及日期时间的字段,要求格式化为字符串传递,日期格式为“YYYY-MM-dd”,时间格式为“YYYY-MM-dd HH:mm:ss”。

请求示例

请求地址:http://域名/rest/tsBlackListController

参数如下:

注意:创建企业无需传id,子表无需传id和企业id,这些都会在后台生成,必需要传入的是来源id和来源表。

  1. {
  2. "ip": "192.1.1.1",
  3. ……(省略信息其他字段)
  4. }

返回示例

  1. 成功案例:
  2. {
  3. "respCode":"0",
  4. " respMsg":"成功"
  5. }
  6. 失败案例:
  7. {
  8. "respCode":"-1",
  9. "respMsg":"黑名单创建失败"
  10. }

3. 查询黑名单信息接口

描述

根据id查询或查询黑名单信息接口。

访问地址

根据id查询

http://域名/rest/tsBlackListController/get/{id}

访问方式

GET

参数

返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(结构参照创建企业接口的参数,具体字段参照excel)

ok

状态

校验规则

请求示例

请求地址:http://域名

  1. /rest/tsBlackListController/get/297e7ae15f7f7f7e015f7fb0f57e0040

返回示例

  1. 成功案例:
  2. {
  3. "message": "成功",
  4. "data": {
  5. "id": "402881f15e751d2a015e75212c570005",
  6. "createBy": "admin",
  7. "updateBy": "",
  8. "bpmStatus": "1",
  9. "ip": "111.193.210.4",
  10. "createName": "管理员",
  11. "createDate": "2017-09-12 16:07:41",
  12. "updateName": "",
  13. "updateDate": null,
  14. "sysOrgCode": "A03",
  15. "sysCompanyCode": "A03"
  16. },
  17. "respCode": "0",
  18. "ok": true
  19. }
  1. 失败案例:
  2. {"data":null,"respCode":"-1","respMsg":"根据所传id查询无结果"}

4. 修改黑名单信息接口

描述

根据id修改

访问地址

http://域名/rest/tsBlackListController/update/{id}

访问方式

PUT

参数

参数名

数据类型

是否必须

示例值

默认值

描述

id

String

Y

“402881f15f811877015f8124ca1c0002”

ip

String

Y

“192.168.1.1”

……省略信息其他字段……

返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(NULL)

ok

状态

校验规则

通过校验主表的字段:来源id和来源表验证数据唯一性。

请求示例

请求地址:http://域名/rest/tsBlackListController/update/402881f15f811877015f8124ca1c0002

参数如下:

  1. {
  2. "id": "402881e75f94878e015f94896bb80002",
  3. "ip": "1.1.1.1"
  4. }

返回示例

  1. 成功案例:
  2. {
  3. "respCode":"0",
  4. "respMsg":"成功"
  5. }
  6. 失败案例:
  7. {
  8. "respCode":"-1",
  9. "respMsg":"输入ID无效,重复输入"
  10. }

5. 删除黑名单接口

描述

根据id删除

访问地址

http://域名/rest/tsBlackListController/delete/{id}

访问方式

DELETE

参数

返回值

参数名

描述

respCode

返回码(见附录1接口返回信息列表)

respMsg

返回信息(见附录1接口返回信息列表)

data

返回结果(NULL)

ok

状态

校验规则

请求示例

请求地址:http://域名/rest/tsBlackListController/delete/297e7ae15f7f7f7e015f7fb0f57e0040

返回示例

  1. 成功案例:
  2. {
  3. "respCode":"0",
  4. "respMsg":"成功"
  5. }
  6. 失败案例:
  7. {
  8. "respCode":"-1",
  9. "respMsg":"输入ID无效,重复输入"
  10. }

五、 客户端测试代码

    代码示例

  1. public static String getToken(String userName,String password){
  2. String url = "http://localhost:8080/jeecg/rest/tokens?username="+userName+"&password="+password;
  3. String token= JwtHttpUtil.httpRequest(url, "POST", null);
  4. return token;
  5. }
  6. //获取黑名单列表
  7. public static JSONObject getBlackList(String token){
  8. String url = "http://localhost:8080/jeecg/rest/tsBlackListController";
  9. JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);
  10. return resp;
  11. }
  12. //创建黑名单
  13. public static JSONObject createBlackList(String token,String json){
  14. String url = "http://localhost:8080/jeecg/rest/tsBlackListController";
  15. JSONObject resp= JwtHttpUtil.httpRequest(url, "POST", json,token);
  16. return resp;
  17. }
  18. //更新黑名单
  19. public static JSONObject updateBlackList(String token,String json){
  20. String url = "http://localhost:8080/jeecg/rest/tsBlackListController";
  21. JSONObject resp= JwtHttpUtil.httpRequest(url, "PUT", json,token);
  22. return resp;
  23. }
  24. //删除黑名单
  25. public static JSONObject deleteBlackList(String token,String id){
  26. String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;
  27. JSONObject resp= JwtHttpUtil.httpRequest(url, "DELETE", null,token);
  28. return resp;
  29. }
  30. //查询黑名单
  31. public static JSONObject getBlackList(String token,String id){
  32. String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;
  33. JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);
  34. return resp;
  35. }
  • 参考源码:
  1. package org.jeecgframework.test.demo;
  2. import org.jeecgframework.jwt.util.JwtHttpUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. /**
  5. * jeecg jwt
  6. * 接口客户端调用demo
  7. * @author qinfeng
  8. *
  9. */
  10. public class JwtRestfulClientDemo {
  11. public static String getToken(String userName,String password){
  12. String url = "http://localhost:8080/jeecg/rest/tokens?username="+userName+"&password="+password;
  13. String token= JwtHttpUtil.httpRequest(url, "POST", null);
  14. return token;
  15. }
  16. //获取黑名单列表
  17. public static JSONObject getBlackList(String token){
  18. String url = "http://localhost:8080/jeecg/rest/tsBlackListController";
  19. JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);
  20. return resp;
  21. }
  22. //创建黑名单
  23. public static JSONObject createBlackList(String token,String json){
  24. String url = "http://localhost:8080/jeecg/rest/tsBlackListController";
  25. JSONObject resp= JwtHttpUtil.httpRequest(url, "POST", json,token);
  26. return resp;
  27. }
  28. //更新黑名单
  29. public static JSONObject updateBlackList(String token,String json){
  30. String url = "http://localhost:8080/jeecg/rest/tsBlackListController";
  31. JSONObject resp= JwtHttpUtil.httpRequest(url, "PUT", json,token);
  32. return resp;
  33. }
  34. //删除黑名单
  35. public static JSONObject deleteBlackList(String token,String id){
  36. String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;
  37. JSONObject resp= JwtHttpUtil.httpRequest(url, "DELETE", null,token);
  38. return resp;
  39. }
  40. //查询黑名单
  41. public static JSONObject getBlackList(String token,String id){
  42. String url = "http://localhost:8080/jeecg/rest/tsBlackListController/"+id;
  43. JSONObject resp= JwtHttpUtil.httpRequest(url, "GET", null,token);
  44. return resp;
  45. }
  46. public static void main(String[] args) {
  47. String token = getToken("interfaceuser","123456");
  48. //      String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJhZG1pbiIsInN1YiI6ImFkbWluIiwiaWF0IjoxNTExODU5NjM2fQ.Emfe8VZKA_L33jaW8ZUtVFVDEin83Np_d3gKlPIZryE";
  49. //      System.out.println(token);
  50. //添加黑名单
  51. //      JSONObject jsonObject=new JSONObject();
  52. //      jsonObject.put("ip","192.168.1.2");
  53. //      System.out.println("======添加黑名单======="+createBlackList(token,jsonObject.toJSONString()));
  54. //更新黑名单
  55. //      JSONObject jsonObject=new JSONObject();
  56. //      jsonObject.put("id","402881ee6001da57016001dc13110001");
  57. //      jsonObject.put("ip","192.168.0.111");
  58. //      System.out.println("======更新黑名单======="+updateBlackList(token,jsonObject.toJSONString()));
  59. //删除黑名单
  60. //      System.out.println("======删除黑名单======="+deleteBlackList(token,"402881ee6001da57016001dc13110001"));
  61. //查询黑名单
  62. //      System.out.println("======查询黑名单======="+getBlackList(token,"402881ee6001e873016001f369f40008"));
  63. //获取黑名单列表
  64. System.out.println("======获取黑名单列表======="+getBlackList(token));
  65. }
  66. }
  1. package org.jeecgframework.jwt.util;
  2. import java.io.BufferedReader;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.net.ConnectException;
  7. import java.net.HttpURLConnection;
  8. import java.net.URL;
  9. import org.jeecgframework.core.util.LogUtil;
  10. import com.alibaba.fastjson.JSONObject;
  11. /**
  12. * JWT 客户端
  13. * @author qinfeng
  14. *
  15. */
  16. public class JwtHttpUtil {
  17. /**
  18. * 发起https请求并获取结果
  19. *
  20. * @param requestUrl
  21. *            请求地址
  22. * @param requestMethod
  23. *            请求方式(GET、POST)
  24. * @param outputStr
  25. *            提交的数据
  26. * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
  27. */
  28. public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr, String sign) {
  29. JSONObject jsonObject = null;
  30. StringBuffer buffer = new StringBuffer();
  31. HttpURLConnection httpUrlConn = null;
  32. try {
  33. // 创建SSLContext对象,并使用我们指定的信任管理器初始化
  34. URL url = new URL(requestUrl);
  35. httpUrlConn = (HttpURLConnection) url.openConnection();
  36. httpUrlConn.setDoOutput(true);
  37. httpUrlConn.setDoInput(true);
  38. httpUrlConn.setUseCaches(false);
  39. httpUrlConn.setRequestProperty("X-AUTH-TOKEN", sign);
  40. httpUrlConn.setRequestProperty("Accept", "*/*");
  41. httpUrlConn.setRequestProperty("Content-Type", "application/json");
  42. // 设置请求方式(GET/POST)
  43. httpUrlConn.setRequestMethod(requestMethod);
  44. if ("GET".equalsIgnoreCase(requestMethod))
  45. httpUrlConn.connect();
  46. // 当有数据需要提交时
  47. if (null != outputStr) {
  48. OutputStream outputStream = httpUrlConn.getOutputStream();
  49. // 注意编码格式,防止中文乱码
  50. outputStream.write(outputStr.getBytes("UTF-8"));
  51. outputStream.close();
  52. }
  53. // 将返回的输入流转换成字符串
  54. InputStream inputStream = httpUrlConn.getInputStream();
  55. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
  56. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
  57. String str = null;
  58. while ((str = bufferedReader.readLine()) != null) {
  59. buffer.append(str);
  60. }
  61. bufferedReader.close();
  62. inputStreamReader.close();
  63. // 释放资源
  64. inputStream.close();
  65. inputStream = null;
  66. httpUrlConn.disconnect();
  67. System.out.println(buffer.toString());
  68. jsonObject = JSONObject.parseObject(buffer.toString());
  69. // jsonObject = JSONObject.fromObject(buffer.toString());
  70. } catch (ConnectException ce) {
  71. LogUtil.info("Weixin server connection timed out.");
  72. } catch (Exception e) {
  73. e.printStackTrace();
  74. org.jeecgframework.core.util.LogUtil.info("https request error:{}" + e.getMessage());
  75. } finally {
  76. try {
  77. httpUrlConn.disconnect();
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. org.jeecgframework.core.util.LogUtil.info("http close error:{}" + e.getMessage());
  81. }
  82. }
  83. return jsonObject;
  84. }
  85. /**
  86. * 发起https请求并获取结果
  87. *
  88. * @param requestUrl
  89. *            请求地址
  90. * @param requestMethod
  91. *            请求方式(GET、POST)
  92. * @param outputStr
  93. *            提交的数据
  94. * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
  95. */
  96. public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {
  97. String res = "";
  98. StringBuffer buffer = new StringBuffer();
  99. HttpURLConnection httpUrlConn = null;
  100. try {
  101. // 创建SSLContext对象,并使用我们指定的信任管理器初始化
  102. URL url = new URL(requestUrl);
  103. httpUrlConn = (HttpURLConnection) url.openConnection();
  104. httpUrlConn.setDoOutput(true);
  105. httpUrlConn.setDoInput(true);
  106. httpUrlConn.setUseCaches(false);
  107. httpUrlConn.setRequestProperty("Accept", "text/plain");
  108. httpUrlConn.setRequestProperty("Content-Type", "application/json");
  109. // 设置请求方式(GET/POST)
  110. httpUrlConn.setRequestMethod(requestMethod);
  111. if ("GET".equalsIgnoreCase(requestMethod))
  112. httpUrlConn.connect();
  113. // 当有数据需要提交时
  114. if (null != outputStr) {
  115. OutputStream outputStream = httpUrlConn.getOutputStream();
  116. // 注意编码格式,防止中文乱码
  117. outputStream.write(outputStr.getBytes("UTF-8"));
  118. outputStream.close();
  119. }
  120. // 将返回的输入流转换成字符串
  121. InputStream inputStream = httpUrlConn.getInputStream();
  122. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
  123. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
  124. String str = null;
  125. while ((str = bufferedReader.readLine()) != null) {
  126. buffer.append(str);
  127. }
  128. bufferedReader.close();
  129. inputStreamReader.close();
  130. // 释放资源
  131. inputStream.close();
  132. inputStream = null;
  133. httpUrlConn.disconnect();
  134. res = buffer.toString();
  135. System.out.println(res);
  136. //          jsonObject = JSONObject.parseObject(buffer.toString());
  137. // jsonObject = JSONObject.fromObject(buffer.toString());
  138. } catch (ConnectException ce) {
  139. LogUtil.info("Weixin server connection timed out.");
  140. } catch (Exception e) {
  141. e.printStackTrace();
  142. org.jeecgframework.core.util.LogUtil.info("https request error:{}" + e.getMessage());
  143. } finally {
  144. try {
  145. httpUrlConn.disconnect();
  146. } catch (Exception e) {
  147. e.printStackTrace();
  148. org.jeecgframework.core.util.LogUtil.info("http close error:{}" + e.getMessage());
  149. }
  150. }
  151. return res;
  152. }
  153. }
  • 附录1:接口返回CODE

code

msg

说明

解决方案

0

SUCCESS

成功

-1

ERROR

无接口访问权限

1000

VALID_ERROR

验证失败

r0001

SAVE_SUCCESS

写入成功

r0002

UPDATE_SUCCESS

更新成功

r0003

REMOVE_SUCCESS

删除成功

【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2的更多相关文章

  1. 【JEECG技术文档】JEECG 接口权限开发及配置使用说明

    1.功能介绍   通过接口配置实现,对接口的访问权限控制和数据权限控制,接口时REST接口,接口权限认证机制使用Json web token (JWT) 接口权限调用流程: (1)通过接口用户的用户名 ...

  2. 【JEECG技术文档】Jeecg高级查询器

    1. 背景 对于用户来讲查询功能按易用性分三个层次: 1)最简单查询操作是一个输入框,全文检索,如百度,后台实现技术使用搜索引擎,需要设计和建立索引,技术较为复杂,适用于文档和信息数据库检索,但是结果 ...

  3. 【JEECG技术文档】JEECG online 表单填值规则使用说明

    1. 功能介绍 JEECG online规则值自动生成功能 为实现online表单数据初始化功能. 为实现图中红框字段初始化功能,需要完成下面4步操作: 1)编写规则实现类 2) 配置填值规则 3)o ...

  4. 【JEECG技术文档】JEECG在线聊天插件功能集成文档

    原文地址:http://jeecg.iteye.com/blog/2320670 JEECG在线聊天插件功能集成文档 前提: 采用jeecg_3.6.3版本以上(Maven工程) 插件项目: 在线聊天 ...

  5. 【JEECG技术文档】表单配置-树形表单

    表单配置支持树型表单了,具体效果如下图: 配置说明: 1.是否树:选择是. 2.树形表单父Id:表的自关联外键. 3.树形表单列表:显示树形图标的列,如上图中为[组织机构名称]. 4.默认值:最外层数 ...

  6. 【JEECG技术文档】online自定义模板的使用

    一. 业务背景 客户需要快速开发一个信息采集的功能模块,并使用已规划好的页面,实现个性化页面展示,使用标准左右布局的Table或DIV风格的页面表现力不强,不能满足客户的个性化页面需要 二. 需求 1 ...

  7. 【JEECG技术文档】JEECG 组织机构导入V3.7

    1.功能介绍 组织机构导入 提供组织机构模版导入功能,使用户更快速的创建组织机构 要使用组织机构导入功能需要完成以下步骤: 1. 下载模版excel 2. 填写组织机构信息 3. 点击导入-选择文件- ...

  8. 【JEECG技术文档】Online唯一校验使用说明

    1.功能介绍 配置了唯一校验的字段,在录入和编辑页面中,动态查询用户输入值是否存在校验. 要使用online唯一校验功能必须先在online表单开发中配置唯一字段的校验方式为唯一校验. 2.配置唯一校 ...

  9. 【JEECG技术文档】JEECG部门管理员操作手册

    功能介绍 使用部门管理员设置需要完成以下步骤: 1. 在“部门管理员设置”菜单配置权限以及分配管理员. 2. 在“部门角色管理”菜单配置角色,以及权限. 3. 在“部门用户角色授权”菜单分配角色到哪个 ...

随机推荐

  1. bzoj5019: [Snoi2017]遗失的答案

    Description 小皮球在计算出答案之后,买了一堆皮肤,他心里很开心,但是一不小心,就忘记自己买了哪些皮肤了.==|||万 幸的是,他还记得他把所有皮肤按照1-N来编号,他买来的那些皮肤的编号( ...

  2. C#创建自定义Object对象

    , B=,J=}; 记录一下,老写成  var obj = new object() { O=0, B=0,J=0};

  3. 【推荐】asp.net 页面的生命周期

    当一个页面请求发送到WEB服务器时,不论该事件是由页面提交还是由页面重定向而激发的,页面在其被创建到释放的过程中都会运行一系列的事件.一个ASP.NET页面从被创建到释放的过程包含10个事件. (1) ...

  4. vue-router2.0

    在使用vue.js创建单页运用的时候,我们通常的做法是配合vue-router一起使用,通过vue-router将组建映射到路由并进行渲染. 例如我们要实现两个页面的切换跳转,就需要使用路由,这里不再 ...

  5. Web jsp开发学习——前端后台传参方法

    一.前端传后台: 1.1表单数据的传递   前端的表单里定义名字name   后台通过名字获取输入的值         1.2页面点击了哪个按钮传递 登录注销的另一种方式   点击登录的地方设置参数 ...

  6. java打印实心10*10正方形, 空心10*10正方形

    public class PrintSquare { public static void main(String[] args) { printSolidSquare(10); System.out ...

  7. 2018年最新PHP面试题

    面试之前多看看公司的资料,可以看出面试的公司主要做什么,电商,数据库,php函数,sql的优化,接口,session和cookie等经常会问到,都是必问之题,这其中有一部分题目摘抄自网络,回答也不错 ...

  8. 初始化ha环境下的hadoop的hdfs

    1)启动zookeeper2)启动所有的journalnode[hadoop@datanode1 ~]$ ~/hadoop-2.7.3/sbin/hadoop-daemon.sh start jour ...

  9. asp.net mvc 5 单元测试小例子

    using System.Collections.Generic; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTest ...

  10. 对偶上升法到增广拉格朗日乘子法到ADMM

    对偶上升法 增广拉格朗日乘子法 ADMM 交替方向乘子法(Alternating Direction Method of Multipliers,ADMM)是一种解决可分解凸优化问题的简单方法,尤其在 ...