Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_42566577
o2oa
提交
9c3c3424
o2oa
项目概览
weixin_42566577
/
o2oa
与 Fork 源项目一致
Fork自
浙江兰德纵横网络技术股份有限公司 / o2oa
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
o2oa
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9c3c3424
编写于
5月 31, 2021
作者:
Z
zhourui
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加可定义token名称
上级
c96d6c47
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
125 addition
and
90 deletion
+125
-90
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Person.java
.../src/main/java/com/x/base/core/project/config/Person.java
+10
-0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/WebServers.java
.../main/java/com/x/base/core/project/config/WebServers.java
+2
-1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/connection/CipherConnectionAction.java
.../base/core/project/connection/CipherConnectionAction.java
+2
-1
o2server/x_base_core_project/src/main/java/com/x/base/core/project/connection/ConnectionAction.java
.../com/x/base/core/project/connection/ConnectionAction.java
+9
-5
o2server/x_base_core_project/src/main/java/com/x/base/core/project/connection/HttpConnection.java
...va/com/x/base/core/project/connection/HttpConnection.java
+27
-24
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/FilterTools.java
...c/main/java/com/x/base/core/project/http/FilterTools.java
+6
-3
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/HttpToken.java
...src/main/java/com/x/base/core/project/http/HttpToken.java
+10
-8
o2server/x_console/src/main/java/com/x/server/console/action/ActionConfig.java
...c/main/java/com/x/server/console/action/ActionConfig.java
+2
-2
o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/ws/collaboration/WsConfigurator.java
...assemble/communicate/ws/collaboration/WsConfigurator.java
+1
-1
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/invoke/InvokeExecutor.java
...m/service/processing/processor/invoke/InvokeExecutor.java
+5
-4
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/invoke/InvokeProcessor.java
.../service/processing/processor/invoke/InvokeProcessor.java
+17
-17
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/authentication/ActionWho.java
.../com/x/program/center/jaxrs/authentication/ActionWho.java
+2
-2
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/warnlog/ActionGetSystemLog.java
...om/x/program/center/jaxrs/warnlog/ActionGetSystemLog.java
+32
-22
未找到文件。
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Person.java
浏览文件 @
9c3c3424
...
...
@@ -47,6 +47,7 @@ public class Person extends ConfigObject {
public
static
final
String
DEFAULT_PASSWORDREGEXHINT
=
"6位以上,包含数字和字母."
;
public
static
final
String
DEFAULT_LANGUAGE
=
"zh-CN"
;
public
static
final
String
DEFAULT_CAPTCHAFONT
=
""
;
public
static
final
String
DEFAULT_TOKENNAME
=
"x-token"
;
public
Person
()
{
this
.
captchaLogin
=
DEFAULT_CAPTCHALOGIN
;
...
...
@@ -63,6 +64,7 @@ public class Person extends ConfigObject {
this
.
tokenCookieHttpOnly
=
DEFAULT_TOKENCOOKIEHTTPONLY
;
this
.
language
=
DEFAULT_LANGUAGE
;
this
.
captchaFont
=
DEFAULT_CAPTCHAFONT
;
this
.
tokenName
=
DEFAULT_TOKENNAME
;
}
public
static
Person
defaultInstance
()
{
...
...
@@ -119,6 +121,9 @@ public class Person extends ConfigObject {
@FieldDescribe
(
"保存token的cookie是否启用httpOnly"
)
private
Boolean
tokenCookieHttpOnly
;
@FieldDescribe
(
"使用识别用户的token名称,可自定义,默认为:"
+
DEFAULT_TOKENNAME
+
"."
)
private
String
tokenName
;
@FieldDescribe
(
"人员组织排序是否为升序,true为升序(默认),false为降序"
)
private
Boolean
personUnitOrderByAsc
;
...
...
@@ -192,6 +197,10 @@ public class Person extends ConfigObject {
}
public
String
getTokenName
()
{
return
StringUtils
.
isBlank
(
this
.
tokenName
)
?
DEFAULT_TOKENNAME
:
this
.
tokenName
;
}
public
Integer
getFailureInterval
()
{
return
(
NumberTools
.
nullOrLessThan
(
this
.
failureInterval
,
0
)
?
DEFAULT_FAILUREINTERVAL
:
this
.
failureInterval
);
}
...
...
@@ -341,4 +350,5 @@ public class Person extends ConfigObject {
public
void
setLanguage
(
String
language
)
{
this
.
language
=
language
;
}
}
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/WebServers.java
浏览文件 @
9c3c3424
...
...
@@ -144,7 +144,8 @@ public class WebServers extends ConcurrentSkipListMap<String, WebServer> {
map
.
put
(
"passwordRegexHint"
,
Config
.
person
().
getPasswordRegexHint
());
/* 平台语言 */
map
.
put
(
"language"
,
Config
.
person
().
getLanguage
());
/* 平台TokenName */
map
.
put
(
"tokenName"
,
Config
.
person
().
getTokenName
());
/* RSA */
File
publicKeyFile
=
new
File
(
Config
.
base
(),
"config/public.key"
);
if
(
publicKeyFile
.
exists
()
&&
publicKeyFile
.
isFile
())
{
...
...
o2server/x_base_core_project/src/main/java/com/x/base/core/project/connection/CipherConnectionAction.java
浏览文件 @
9c3c3424
...
...
@@ -159,7 +159,8 @@ public class CipherConnectionAction {
public
static
List
<
NameValuePair
>
cipher
()
throws
Exception
{
EffectivePerson
effectivePerson
=
EffectivePerson
.
cipher
(
Config
.
token
().
getCipher
());
return
ListTools
.
toList
(
new
NameValuePair
(
HttpToken
.
X_Token
,
effectivePerson
.
getToken
()));
// return ListTools.toList(new NameValuePair(HttpToken.X_Token, effectivePerson.getToken()));
return
ListTools
.
toList
(
new
NameValuePair
(
Config
.
person
().
getTokenName
(),
effectivePerson
.
getToken
()));
}
public
static
String
trim
(
String
uri
)
{
...
...
o2server/x_base_core_project/src/main/java/com/x/base/core/project/connection/ConnectionAction.java
浏览文件 @
9c3c3424
...
...
@@ -17,6 +17,7 @@ import com.google.gson.Gson;
import
com.google.gson.JsonElement
;
import
com.google.gson.JsonParseException
;
import
com.x.base.core.project.bean.NameValuePair
;
import
com.x.base.core.project.config.Config
;
import
com.x.base.core.project.gson.XGsonBuilder
;
import
com.x.base.core.project.http.ActionResult.Type
;
import
com.x.base.core.project.tools.DefaultCharset
;
...
...
@@ -39,7 +40,7 @@ public class ConnectionAction {
public
static
final
String
ACCESS_CONTROL_ALLOW_CREDENTIALS
=
"Access-Control-Allow-Credentials"
;
public
static
final
String
ACCESS_CONTROL_ALLOW_CREDENTIALS_VALUE
=
"true"
;
public
static
final
String
ACCESS_CONTROL_ALLOW_HEADERS
=
"Access-Control-Allow-Headers"
;
public
static
final
String
ACCESS_CONTROL_ALLOW_HEADERS_VALUE
=
"x-requested-with, x-request,
x-token,
Content-Type, x-cipher, x-client"
;
public
static
final
String
ACCESS_CONTROL_ALLOW_HEADERS_VALUE
=
"x-requested-with, x-request, Content-Type, x-cipher, x-client"
;
public
static
final
String
ACCESS_CONTROL_ALLOW_METHODS
=
"Access-Control-Allow-Methods"
;
public
static
final
String
ACCESS_CONTROL_ALLOW_METHODS_VALUE
=
"GET, POST, OPTIONS, PUT, DELETE, HEAD, TRACE"
;
...
...
@@ -399,10 +400,11 @@ public class ConnectionAction {
return
bytes
;
}
private
static
void
addHeads
(
HttpURLConnection
connection
,
List
<
NameValuePair
>
heads
)
{
private
static
void
addHeads
(
HttpURLConnection
connection
,
List
<
NameValuePair
>
heads
)
throws
Exception
{
Map
<
String
,
String
>
map
=
new
TreeMap
<>();
map
.
put
(
ACCESS_CONTROL_ALLOW_CREDENTIALS
,
ACCESS_CONTROL_ALLOW_CREDENTIALS_VALUE
);
map
.
put
(
ACCESS_CONTROL_ALLOW_HEADERS
,
ACCESS_CONTROL_ALLOW_HEADERS_VALUE
);
map
.
put
(
ACCESS_CONTROL_ALLOW_HEADERS
,
ACCESS_CONTROL_ALLOW_HEADERS_VALUE
+
", "
+
Config
.
person
().
getTokenName
());
map
.
put
(
ACCESS_CONTROL_ALLOW_METHODS
,
ACCESS_CONTROL_ALLOW_METHODS_VALUE
);
map
.
put
(
CACHE_CONTROL
,
CACHE_CONTROL_VALUE
);
map
.
put
(
CONTENT_TYPE
,
CONTENT_TYPE_VALUE
);
...
...
@@ -418,10 +420,12 @@ public class ConnectionAction {
map
.
entrySet
().
forEach
((
o
->
connection
.
addRequestProperty
(
o
.
getKey
(),
o
.
getValue
())));
}
private
static
void
addHeadsMultiPart
(
HttpURLConnection
connection
,
List
<
NameValuePair
>
heads
,
String
boundary
)
{
private
static
void
addHeadsMultiPart
(
HttpURLConnection
connection
,
List
<
NameValuePair
>
heads
,
String
boundary
)
throws
Exception
{
Map
<
String
,
String
>
map
=
new
TreeMap
<>();
map
.
put
(
ACCESS_CONTROL_ALLOW_CREDENTIALS
,
ACCESS_CONTROL_ALLOW_CREDENTIALS_VALUE
);
map
.
put
(
ACCESS_CONTROL_ALLOW_HEADERS
,
ACCESS_CONTROL_ALLOW_HEADERS_VALUE
);
map
.
put
(
ACCESS_CONTROL_ALLOW_HEADERS
,
ACCESS_CONTROL_ALLOW_HEADERS_VALUE
+
", "
+
Config
.
person
().
getTokenName
());
map
.
put
(
ACCESS_CONTROL_ALLOW_METHODS
,
ACCESS_CONTROL_ALLOW_METHODS_VALUE
);
map
.
put
(
CACHE_CONTROL
,
CACHE_CONTROL_VALUE
);
connection
.
setRequestProperty
(
CONTENT_TYPE
,
String
.
format
(
"multipart/form-data; boundary=%s"
,
boundary
));
...
...
o2server/x_base_core_project/src/main/java/com/x/base/core/project/connection/HttpConnection.java
浏览文件 @
9c3c3424
...
...
@@ -18,30 +18,31 @@ import org.apache.commons.lang3.StringUtils;
import
com.google.gson.reflect.TypeToken
;
import
com.x.base.core.project.bean.NameValuePair
;
import
com.x.base.core.project.config.Config
;
import
com.x.base.core.project.gson.XGsonBuilder
;
import
com.x.base.core.project.tools.ListTools
;
public
class
HttpConnection
{
public
static
final
String
Access_Control_Allow_Credentials
=
"Access-Control-Allow-Credentials"
;
public
static
final
String
Access_Control_Allow_Credentials_Value
=
"true"
;
public
static
final
String
Access_Control_Allow_Headers
=
"Access-Control-Allow-Headers"
;
public
static
final
String
Access_Control_Allow_Headers_Value
=
"x-requested-with, x-request, x-token,Content-Type, x-cipher"
;
public
static
final
String
Access_Control_Allow_Methods
=
"Access-Control-Allow-Methods"
;
public
static
final
String
Access_Control_Allow_Methods_Value
=
"GET, POST, OPTIONS, PUT, DELETE, HEAD, TRACE"
;
public
static
final
String
Cache_Control
=
"Cache-Control"
;
public
static
final
String
Cache_Control_Value
=
"no-cache, no-transform"
;
public
static
final
String
Content_Type
=
"Content-Type"
;
public
static
final
String
Content_Type_Value
=
"application/json;charset=UTF-8"
;
public
static
final
String
METHOD_POST
=
"POST"
;
public
static
final
String
METHOD_GET
=
"GET"
;
public
static
final
String
METHOD_PUT
=
"PUT"
;
public
static
final
String
METHOD_DELETE
=
"DELETE"
;
//
public static final String Access_Control_Allow_Credentials = "Access-Control-Allow-Credentials";
//
public static final String Access_Control_Allow_Credentials_Value = "true";
//
public static final String Access_Control_Allow_Headers = "Access-Control-Allow-Headers";
//
public static final String Access_Control_Allow_Headers_Value = "x-requested-with, x-request, x-token,Content-Type, x-cipher";
//
public static final String Access_Control_Allow_Methods = "Access-Control-Allow-Methods";
//
public static final String Access_Control_Allow_Methods_Value = "GET, POST, OPTIONS, PUT, DELETE, HEAD, TRACE";
//
public static final String Cache_Control = "Cache-Control";
//
public static final String Cache_Control_Value = "no-cache, no-transform";
//
public static final String Content_Type = "Content-Type";
//
public static final String Content_Type_Value = "application/json;charset=UTF-8";
//
//
public static final String METHOD_POST = "POST";
//
public static final String METHOD_GET = "GET";
//
public static final String METHOD_PUT = "PUT";
//
public static final String METHOD_DELETE = "DELETE";
public
static
String
getAsString
(
String
address
,
List
<
NameValuePair
>
heads
)
throws
Exception
{
HttpURLConnection
connection
=
prepare
(
address
,
heads
);
connection
.
setRequestMethod
(
METHOD_GET
);
connection
.
setRequestMethod
(
ConnectionAction
.
METHOD_GET
);
connection
.
setDoOutput
(
false
);
connection
.
setDoInput
(
true
);
String
str
=
readResultString
(
connection
);
...
...
@@ -63,7 +64,7 @@ public class HttpConnection {
public
static
String
postAsString
(
String
address
,
List
<
NameValuePair
>
heads
,
String
body
)
throws
Exception
{
HttpURLConnection
connection
=
prepare
(
address
,
heads
);
connection
.
setRequestMethod
(
METHOD_POST
);
connection
.
setRequestMethod
(
ConnectionAction
.
METHOD_POST
);
connection
.
setDoOutput
(
true
);
connection
.
setDoInput
(
true
);
connection
.
connect
();
...
...
@@ -89,7 +90,7 @@ public class HttpConnection {
public
static
String
putAsString
(
String
address
,
List
<
NameValuePair
>
heads
,
String
body
)
throws
Exception
{
HttpURLConnection
connection
=
prepare
(
address
,
heads
);
connection
.
setRequestMethod
(
METHOD_PUT
);
connection
.
setRequestMethod
(
ConnectionAction
.
METHOD_PUT
);
connection
.
setDoOutput
(
true
);
connection
.
setDoInput
(
true
);
connection
.
connect
();
...
...
@@ -115,7 +116,7 @@ public class HttpConnection {
public
static
String
deleteAsString
(
String
address
,
List
<
NameValuePair
>
heads
)
throws
Exception
{
HttpURLConnection
connection
=
prepare
(
address
,
heads
);
connection
.
setRequestMethod
(
METHOD_DELETE
);
connection
.
setRequestMethod
(
ConnectionAction
.
METHOD_DELETE
);
connection
.
setDoOutput
(
false
);
connection
.
setDoInput
(
true
);
String
str
=
readResultString
(
connection
);
...
...
@@ -141,11 +142,13 @@ public class HttpConnection {
HttpURLConnection
httpUrlConnection
=
(
HttpURLConnection
)
url
.
openConnection
();
httpUrlConnection
.
setUseCaches
(
false
);
Map
<
String
,
String
>
map
=
new
HashMap
<>();
map
.
put
(
Access_Control_Allow_Credentials
,
Access_Control_Allow_Credentials_Value
);
map
.
put
(
Access_Control_Allow_Headers
,
Access_Control_Allow_Headers_Value
);
map
.
put
(
Access_Control_Allow_Methods
,
Access_Control_Allow_Methods_Value
);
map
.
put
(
Cache_Control
,
Cache_Control_Value
);
map
.
put
(
Content_Type
,
Content_Type_Value
);
map
.
put
(
ConnectionAction
.
ACCESS_CONTROL_ALLOW_CREDENTIALS
,
ConnectionAction
.
ACCESS_CONTROL_ALLOW_CREDENTIALS_VALUE
);
map
.
put
(
ConnectionAction
.
ACCESS_CONTROL_ALLOW_HEADERS
,
ConnectionAction
.
ACCESS_CONTROL_ALLOW_HEADERS_VALUE
+
", "
+
Config
.
person
().
getTokenName
());
map
.
put
(
ConnectionAction
.
ACCESS_CONTROL_ALLOW_METHODS
,
ConnectionAction
.
ACCESS_CONTROL_ALLOW_METHODS_VALUE
);
map
.
put
(
ConnectionAction
.
CACHE_CONTROL
,
ConnectionAction
.
CACHE_CONTROL_VALUE
);
map
.
put
(
ConnectionAction
.
CONTENT_TYPE
,
ConnectionAction
.
CONTENT_TYPE_VALUE
);
for
(
NameValuePair
o
:
ListTools
.
nullToEmpty
(
heads
))
{
map
.
put
(
o
.
getName
(),
Objects
.
toString
(
o
.
getValue
()));
}
...
...
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/FilterTools.java
浏览文件 @
9c3c3424
...
...
@@ -5,6 +5,8 @@ import javax.servlet.http.HttpServletResponse;
import
org.apache.commons.lang3.StringUtils
;
import
com.x.base.core.project.config.Config
;
public
class
FilterTools
{
public
static
final
String
Access_Control_Allow_Origin
=
"Access-Control-Allow-Origin"
;
...
...
@@ -12,7 +14,7 @@ public class FilterTools {
public
static
final
String
Access_Control_Allow_Methods
=
"Access-Control-Allow-Methods"
;
public
static
final
String
Access_Control_Allow_Methods_Value
=
"GET, POST, OPTIONS, PUT, DELETE, HEAD, TRACE"
;
public
static
final
String
Access_Control_Allow_Headers
=
"Access-Control-Allow-Headers"
;
public
static
final
String
Access_Control_Allow_Headers_Value
=
"x-requested-with, x-request,
x-token,
c-token, Content-Type, Content-Length, x-cipher, x-client, x-debugger, Authorization, P-User-Id, P-Request-Id, P-Page-Id"
;
public
static
final
String
Access_Control_Allow_Headers_Value
=
"x-requested-with, x-request, c-token, Content-Type, Content-Length, x-cipher, x-client, x-debugger, Authorization, P-User-Id, P-Request-Id, P-Page-Id"
;
public
static
final
String
Access_Control_Allow_Credentials
=
"Access-Control-Allow-Credentials"
;
public
static
final
String
Access_Control_Expose_Headers
=
"Access-Control-Expose-Headers"
;
public
static
final
String
Access_Control_Max_Age
=
"Access-Control-Max-Age"
;
...
...
@@ -22,9 +24,10 @@ public class FilterTools {
String
origin
=
request
.
getHeader
(
ORIGIN
);
response
.
addHeader
(
Access_Control_Allow_Origin
,
StringUtils
.
isBlank
(
origin
)
?
"*"
:
origin
);
response
.
addHeader
(
Access_Control_Allow_Methods
,
Access_Control_Allow_Methods_Value
);
response
.
addHeader
(
Access_Control_Allow_Headers
,
Access_Control_Allow_Headers_Value
);
response
.
addHeader
(
Access_Control_Allow_Headers
,
Access_Control_Allow_Headers_Value
+
", "
+
Config
.
person
().
getTokenName
());
response
.
addHeader
(
Access_Control_Allow_Credentials
,
"true"
);
response
.
setHeader
(
Access_Control_Expose_Headers
,
"
x-token, c-token"
);
response
.
setHeader
(
Access_Control_Expose_Headers
,
"
c-token"
+
", "
+
Config
.
person
().
getTokenName
()
);
response
.
setHeader
(
Access_Control_Max_Age
,
Access_Control_Max_Age_Value
);
}
...
...
o2server/x_base_core_project/src/main/java/com/x/base/core/project/http/HttpToken.java
浏览文件 @
9c3c3424
...
...
@@ -27,7 +27,7 @@ public class HttpToken {
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
HttpToken
.
class
);
public
static
final
String
X_Token
=
"x-token"
;
//
public static final String X_Token = "x-token";
public
static
final
String
X_Authorization
=
"authorization"
;
public
static
final
String
X_Person
=
"x-person"
;
public
static
final
String
X_Client
=
"x-client"
;
...
...
@@ -99,7 +99,8 @@ public class HttpToken {
try
{
// String cookie = X_Token + "=; path=/; domain=" +
// this.domain(request) + "; max-age=0
String
cookie
=
X_Token
+
"="
+
COOKIE_ANONYMOUS_VALUE
+
"; path=/; domain="
+
this
.
domain
(
request
)
String
cookie
=
Config
.
person
().
getTokenName
()
+
"="
+
COOKIE_ANONYMOUS_VALUE
+
"; path=/; domain="
+
this
.
domain
(
request
)
+
(
BooleanUtils
.
isTrue
(
Config
.
person
().
getTokenCookieHttpOnly
())
?
"; HttpOnly"
:
""
);
response
.
setHeader
(
SET_COOKIE
,
cookie
);
}
catch
(
Exception
e
)
{
...
...
@@ -129,10 +130,11 @@ public class HttpToken {
private
void
setResponseToken
(
HttpServletRequest
request
,
HttpServletResponse
response
,
EffectivePerson
effectivePerson
)
throws
Exception
{
if
(!
StringUtils
.
isEmpty
(
effectivePerson
.
getToken
()))
{
String
cookie
=
X_Token
+
"="
+
effectivePerson
.
getToken
()
+
"; path=/; domain="
+
this
.
domain
(
request
)
String
cookie
=
Config
.
person
().
getTokenName
()
+
"="
+
effectivePerson
.
getToken
()
+
"; path=/; domain="
+
this
.
domain
(
request
)
+
(
BooleanUtils
.
isTrue
(
Config
.
person
().
getTokenCookieHttpOnly
())
?
"; HttpOnly"
:
""
);
response
.
setHeader
(
SET_COOKIE
,
cookie
);
response
.
setHeader
(
X_Token
,
effectivePerson
.
getToken
());
response
.
setHeader
(
Config
.
person
().
getTokenName
()
,
effectivePerson
.
getToken
());
}
}
...
...
@@ -148,11 +150,11 @@ public class HttpToken {
public
String
getToken
(
HttpServletRequest
request
)
throws
Exception
{
String
token
=
null
;
token
=
URLTools
.
getQueryStringParameter
(
request
.
getQueryString
(),
X_Token
);
token
=
URLTools
.
getQueryStringParameter
(
request
.
getQueryString
(),
Config
.
person
().
getTokenName
()
);
if
(
StringUtils
.
isEmpty
(
token
))
{
if
(
null
!=
request
.
getCookies
())
{
for
(
Cookie
c
:
request
.
getCookies
())
{
if
(
StringUtils
.
equals
(
X_Token
,
c
.
getName
()))
{
if
(
StringUtils
.
equals
(
Config
.
person
().
getTokenName
()
,
c
.
getName
()))
{
token
=
c
.
getValue
();
break
;
}
...
...
@@ -160,10 +162,10 @@ public class HttpToken {
}
}
if
(
StringUtils
.
isEmpty
(
token
))
{
token
=
request
.
getHeader
(
X_Token
);
token
=
request
.
getHeader
(
Config
.
person
().
getTokenName
()
);
}
if
(
StringUtils
.
isEmpty
(
token
))
{
//如果使用oauth bearer 通过此传递认证信息.需要进行判断,格式为 Bearer xxxxxxx
//
如果使用oauth bearer 通过此传递认证信息.需要进行判断,格式为 Bearer xxxxxxx
String
value
=
request
.
getHeader
(
X_Authorization
);
if
(!
StringUtils
.
contains
(
value
,
" "
))
{
token
=
value
;
...
...
o2server/x_console/src/main/java/com/x/server/console/action/ActionConfig.java
浏览文件 @
9c3c3424
...
...
@@ -35,13 +35,13 @@ public class ActionConfig extends ActionBase {
@SuppressWarnings
(
"deprecation"
)
private
byte
[]
getZip
()
throws
Exception
{
String
address
=
Config
.
url_x_program_center_jaxrs
(
"config"
);
String
address
=
Config
.
url_x_program_center_jaxrs
(
"config"
);
URL
url
=
new
URL
(
address
);
HttpURLConnection
connection
=
(
HttpURLConnection
)
url
.
openConnection
();
connection
.
setUseCaches
(
false
);
connection
.
setRequestProperty
(
"Content-Type"
,
HttpMediaType
.
APPLICATION_JSON_UTF_8
);
EffectivePerson
effectivePerson
=
EffectivePerson
.
cipher
(
Config
.
token
().
getCipher
());
connection
.
setRequestProperty
(
HttpToken
.
X_Token
,
effectivePerson
.
getToken
());
connection
.
setRequestProperty
(
Config
.
person
().
getTokenName
()
,
effectivePerson
.
getToken
());
connection
.
setRequestMethod
(
"GET"
);
connection
.
setDoOutput
(
false
);
connection
.
setDoInput
(
true
);
...
...
o2server/x_message_assemble_communicate/src/main/java/com/x/message/assemble/communicate/ws/collaboration/WsConfigurator.java
浏览文件 @
9c3c3424
...
...
@@ -27,7 +27,7 @@ public class WsConfigurator extends ServerEndpointConfig.Configurator {
private
EffectivePerson
getEffectivePerson
(
HandshakeRequest
request
)
{
try
{
List
<
String
>
list
=
request
.
getParameterMap
().
get
(
HttpToken
.
X_Token
);
List
<
String
>
list
=
request
.
getParameterMap
().
get
(
Config
.
person
().
getTokenName
()
);
String
token
=
null
;
if
(
ListTools
.
isNotEmpty
(
list
))
{
token
=
list
.
get
(
0
);
...
...
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/invoke/InvokeExecutor.java
浏览文件 @
9c3c3424
...
...
@@ -9,6 +9,7 @@ import org.apache.commons.lang3.StringUtils;
import
com.x.base.core.project.bean.NameValuePair
;
import
com.x.base.core.project.connection.CipherConnectionAction
;
import
com.x.base.core.project.connection.ConnectionAction
;
import
com.x.base.core.project.connection.HttpConnection
;
import
com.x.base.core.project.logger.Logger
;
import
com.x.base.core.project.logger.LoggerFactory
;
...
...
@@ -59,7 +60,7 @@ public class InvokeExecutor {
.
toString
();
}
else
{
List
<
NameValuePair
>
heads
=
new
ArrayList
<>();
heads
.
add
(
new
NameValuePair
(
HttpConnection
.
Content_Type
,
jaxrsObject
.
getContentType
()));
heads
.
add
(
new
NameValuePair
(
ConnectionAction
.
CONTENT_TYPE
,
jaxrsObject
.
getContentType
()));
if
(
null
!=
jaxrsObject
.
getHead
())
{
for
(
Entry
<
String
,
String
>
entry
:
jaxrsObject
.
getHead
().
entrySet
())
{
heads
.
add
(
new
NameValuePair
(
entry
.
getKey
(),
entry
.
getValue
()));
...
...
@@ -80,7 +81,7 @@ public class InvokeExecutor {
.
toString
();
}
else
{
List
<
NameValuePair
>
heads
=
new
ArrayList
<>();
heads
.
add
(
new
NameValuePair
(
HttpConnection
.
Content_Type
,
jaxrsObject
.
getContentType
()));
heads
.
add
(
new
NameValuePair
(
ConnectionAction
.
CONTENT_TYPE
,
jaxrsObject
.
getContentType
()));
if
(
null
!=
jaxrsObject
.
getHead
())
{
for
(
Entry
<
String
,
String
>
entry
:
jaxrsObject
.
getHead
().
entrySet
())
{
heads
.
add
(
new
NameValuePair
(
entry
.
getKey
(),
entry
.
getValue
()));
...
...
@@ -100,7 +101,7 @@ public class InvokeExecutor {
return
CipherConnectionAction
.
get
(
true
,
jaxrsObject
.
getAddress
()).
getData
().
toString
();
}
else
{
List
<
NameValuePair
>
heads
=
new
ArrayList
<>();
heads
.
add
(
new
NameValuePair
(
HttpConnection
.
Content_Type
,
jaxrsObject
.
getContentType
()));
heads
.
add
(
new
NameValuePair
(
ConnectionAction
.
CONTENT_TYPE
,
jaxrsObject
.
getContentType
()));
if
(
null
!=
jaxrsObject
.
getHead
())
{
for
(
Entry
<
String
,
String
>
entry
:
jaxrsObject
.
getHead
().
entrySet
())
{
heads
.
add
(
new
NameValuePair
(
entry
.
getKey
(),
entry
.
getValue
()));
...
...
@@ -120,7 +121,7 @@ public class InvokeExecutor {
return
CipherConnectionAction
.
delete
(
true
,
jaxrsObject
.
getAddress
()).
getData
().
toString
();
}
else
{
List
<
NameValuePair
>
heads
=
new
ArrayList
<>();
heads
.
add
(
new
NameValuePair
(
HttpConnection
.
Content_Type
,
jaxrsObject
.
getContentType
()));
heads
.
add
(
new
NameValuePair
(
ConnectionAction
.
CONTENT_TYPE
,
jaxrsObject
.
getContentType
()));
if
(
null
!=
jaxrsObject
.
getHead
())
{
for
(
Entry
<
String
,
String
>
entry
:
jaxrsObject
.
getHead
().
entrySet
())
{
heads
.
add
(
new
NameValuePair
(
entry
.
getKey
(),
entry
.
getValue
()));
...
...
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/processor/invoke/InvokeProcessor.java
浏览文件 @
9c3c3424
...
...
@@ -18,7 +18,7 @@ import com.x.base.core.container.EntityManagerContainer;
import
com.x.base.core.project.Application
;
import
com.x.base.core.project.connection.ActionResponse
;
import
com.x.base.core.project.connection.CipherConnectionAction
;
import
com.x.base.core.project.connection.
HttpConne
ction
;
import
com.x.base.core.project.connection.
ConnectionA
ction
;
import
com.x.base.core.project.exception.RunningException
;
import
com.x.base.core.project.http.ActionResult.Type
;
import
com.x.base.core.project.logger.Logger
;
...
...
@@ -142,16 +142,16 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
Class
<?>
clz
=
Class
.
forName
(
"com.x.base.core.project."
+
invoke
.
getInternalProject
());
String
uri
=
this
.
jaxrsUrl
(
aeiObjects
,
invoke
);
switch
(
StringUtils
.
upperCase
(
invoke
.
getJaxrsMethod
()))
{
case
HttpConne
ction
.
METHOD_POST
:
case
ConnectionA
ction
.
METHOD_POST
:
resp
=
jaxrsInternalPost
(
aeiObjects
,
invoke
,
clz
,
uri
);
break
;
case
HttpConne
ction
.
METHOD_PUT
:
case
ConnectionA
ction
.
METHOD_PUT
:
resp
=
jaxrsInternalPut
(
aeiObjects
,
invoke
,
clz
,
uri
);
break
;
case
HttpConne
ction
.
METHOD_GET
:
case
ConnectionA
ction
.
METHOD_GET
:
resp
=
jaxrsInternalGet
(
aeiObjects
,
invoke
,
clz
,
uri
);
break
;
case
HttpConne
ction
.
METHOD_DELETE
:
case
ConnectionA
ction
.
METHOD_DELETE
:
resp
=
jaxrsInternalDelete
(
aeiObjects
,
invoke
,
clz
,
uri
);
break
;
case
"head"
:
...
...
@@ -196,7 +196,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
jaxrsObject
.
setAddress
(
StringTools
.
JoinUrl
(
application
.
getUrlJaxrsRoot
()
+
CipherConnectionAction
.
trim
(
uri
)));
jaxrsObject
.
setInternal
(
invoke
.
getInternal
());
jaxrsObject
.
setMethod
(
HttpConne
ction
.
METHOD_DELETE
);
jaxrsObject
.
setMethod
(
ConnectionA
ction
.
METHOD_DELETE
);
jaxrsObject
.
setContentType
(
invoke
.
getJaxrsContentType
());
ThisApplication
.
syncJaxrsInvokeQueue
.
send
(
jaxrsObject
);
}
else
{
...
...
@@ -213,7 +213,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
jaxrsObject
.
setAddress
(
StringTools
.
JoinUrl
(
application
.
getUrlJaxrsRoot
()
+
CipherConnectionAction
.
trim
(
uri
)));
jaxrsObject
.
setInternal
(
invoke
.
getInternal
());
jaxrsObject
.
setMethod
(
HttpConne
ction
.
METHOD_GET
);
jaxrsObject
.
setMethod
(
ConnectionA
ction
.
METHOD_GET
);
jaxrsObject
.
setContentType
(
invoke
.
getJaxrsContentType
());
ThisApplication
.
syncJaxrsInvokeQueue
.
send
(
jaxrsObject
);
}
else
{
...
...
@@ -232,7 +232,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
.
setAddress
(
StringTools
.
JoinUrl
(
application
.
getUrlJaxrsRoot
()
+
CipherConnectionAction
.
trim
(
uri
)));
jaxrsObject
.
setBody
(
body
);
jaxrsObject
.
setInternal
(
invoke
.
getInternal
());
jaxrsObject
.
setMethod
(
HttpConne
ction
.
METHOD_PUT
);
jaxrsObject
.
setMethod
(
ConnectionA
ction
.
METHOD_PUT
);
jaxrsObject
.
setContentType
(
invoke
.
getJaxrsContentType
());
ThisApplication
.
syncJaxrsInvokeQueue
.
send
(
jaxrsObject
);
}
else
{
...
...
@@ -251,7 +251,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
.
setAddress
(
StringTools
.
JoinUrl
(
application
.
getUrlJaxrsRoot
()
+
CipherConnectionAction
.
trim
(
uri
)));
jaxrsObject
.
setBody
(
body
);
jaxrsObject
.
setInternal
(
invoke
.
getInternal
());
jaxrsObject
.
setMethod
(
HttpConne
ction
.
METHOD_POST
);
jaxrsObject
.
setMethod
(
ConnectionA
ction
.
METHOD_POST
);
jaxrsObject
.
setContentType
(
invoke
.
getJaxrsContentType
());
ThisApplication
.
syncJaxrsInvokeQueue
.
send
(
jaxrsObject
);
}
else
{
...
...
@@ -266,16 +266,16 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
JaxrsObject
jaxrsObject
=
new
JaxrsObject
();
jaxrsObject
.
setHead
(
this
.
jaxrsEvalHead
(
aeiObjects
,
invoke
));
switch
(
StringUtils
.
upperCase
(
invoke
.
getJaxrsMethod
()))
{
case
HttpConne
ction
.
METHOD_POST
:
case
ConnectionA
ction
.
METHOD_POST
:
result
=
jaxrsExternalPost
(
aeiObjects
,
invoke
,
uri
,
jaxrsObject
);
break
;
case
HttpConne
ction
.
METHOD_PUT
:
case
ConnectionA
ction
.
METHOD_PUT
:
result
=
jaxrsExternalPut
(
aeiObjects
,
invoke
,
uri
,
jaxrsObject
);
break
;
case
HttpConne
ction
.
METHOD_GET
:
case
ConnectionA
ction
.
METHOD_GET
:
result
=
jaxrsExternalGet
(
aeiObjects
,
invoke
,
uri
,
jaxrsObject
);
break
;
case
HttpConne
ction
.
METHOD_DELETE
:
case
ConnectionA
ction
.
METHOD_DELETE
:
result
=
jaxrsExternalDelete
(
aeiObjects
,
invoke
,
uri
,
jaxrsObject
);
break
;
case
"head"
:
...
...
@@ -311,7 +311,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
private
String
jaxrsExternalDelete
(
AeiObjects
aeiObjects
,
Invoke
invoke
,
String
address
,
JaxrsObject
jaxrsObject
)
throws
Exception
{
jaxrsObject
.
setMethod
(
HttpConne
ction
.
METHOD_DELETE
);
jaxrsObject
.
setMethod
(
ConnectionA
ction
.
METHOD_DELETE
);
jaxrsObject
.
setInternal
(
false
);
jaxrsObject
.
setAddress
(
address
);
jaxrsObject
.
setContentType
(
invoke
.
getJaxrsContentType
());
...
...
@@ -326,7 +326,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
private
String
jaxrsExternalGet
(
AeiObjects
aeiObjects
,
Invoke
invoke
,
String
address
,
JaxrsObject
jaxrsObject
)
throws
Exception
{
jaxrsObject
.
setMethod
(
HttpConne
ction
.
METHOD_GET
);
jaxrsObject
.
setMethod
(
ConnectionA
ction
.
METHOD_GET
);
jaxrsObject
.
setInternal
(
false
);
jaxrsObject
.
setAddress
(
address
);
jaxrsObject
.
setContentType
(
invoke
.
getJaxrsContentType
());
...
...
@@ -342,7 +342,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
private
String
jaxrsExternalPut
(
AeiObjects
aeiObjects
,
Invoke
invoke
,
String
address
,
JaxrsObject
jaxrsObject
)
throws
Exception
{
String
body
=
this
.
jaxrsEvalBody
(
aeiObjects
,
invoke
);
jaxrsObject
.
setMethod
(
HttpConne
ction
.
METHOD_PUT
);
jaxrsObject
.
setMethod
(
ConnectionA
ction
.
METHOD_PUT
);
jaxrsObject
.
setInternal
(
false
);
jaxrsObject
.
setAddress
(
address
);
jaxrsObject
.
setBody
(
body
);
...
...
@@ -359,7 +359,7 @@ public class InvokeProcessor extends AbstractInvokeProcessor {
private
String
jaxrsExternalPost
(
AeiObjects
aeiObjects
,
Invoke
invoke
,
String
address
,
JaxrsObject
jaxrsObject
)
throws
Exception
{
String
body
=
this
.
jaxrsEvalBody
(
aeiObjects
,
invoke
);
jaxrsObject
.
setMethod
(
HttpConne
ction
.
METHOD_POST
);
jaxrsObject
.
setMethod
(
ConnectionA
ction
.
METHOD_POST
);
jaxrsObject
.
setInternal
(
false
);
jaxrsObject
.
setAddress
(
address
);
jaxrsObject
.
setBody
(
body
);
...
...
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/authentication/ActionWho.java
浏览文件 @
9c3c3424
...
...
@@ -10,10 +10,10 @@ import com.x.base.core.project.Application;
import
com.x.base.core.project.Applications
;
import
com.x.base.core.project.x_organization_assemble_authentication
;
import
com.x.base.core.project.bean.NameValuePair
;
import
com.x.base.core.project.config.Config
;
import
com.x.base.core.project.connection.HttpConnection
;
import
com.x.base.core.project.http.ActionResult
;
import
com.x.base.core.project.http.EffectivePerson
;
import
com.x.base.core.project.http.HttpToken
;
import
com.x.program.center.ThisApplication
;
class
ActionWho
extends
BaseAction
{
...
...
@@ -25,7 +25,7 @@ class ActionWho extends BaseAction {
.
randomWithWeight
(
x_organization_assemble_authentication
.
class
.
getName
());
if
(
app
!=
null
)
{
List
<
NameValuePair
>
heads
=
new
ArrayList
<>();
heads
.
add
(
new
NameValuePair
(
HttpToken
.
X_Token
,
token
));
heads
.
add
(
new
NameValuePair
(
Config
.
person
().
getTokenName
()
,
token
));
JsonElement
jsonElement
=
HttpConnection
.
getAsObject
(
app
.
getUrlJaxrsRoot
()
+
Applications
.
joinQueryUri
(
"authentication"
),
heads
,
JsonElement
.
class
);
result
.
setData
(
jsonElement
);
...
...
o2server/x_program_center/src/main/java/com/x/program/center/jaxrs/warnlog/ActionGetSystemLog.java
浏览文件 @
9c3c3424
package
com.x.program.center.jaxrs.warnlog
;
import
java.io.DataInputStream
;
import
java.io.DataOutputStream
;
import
java.net.Socket
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
org.apache.commons.lang3.StringUtils
;
import
com.google.gson.reflect.TypeToken
;
import
com.x.base.core.project.bean.NameValuePair
;
import
com.x.base.core.project.cache.Cache.CacheCategory
;
...
...
@@ -12,17 +23,10 @@ import com.x.base.core.project.gson.GsonPropertyObject;
import
com.x.base.core.project.gson.XGsonBuilder
;
import
com.x.base.core.project.http.ActionResult
;
import
com.x.base.core.project.http.EffectivePerson
;
import
com.x.base.core.project.http.HttpToken
;
import
com.x.base.core.project.logger.Logger
;
import
com.x.base.core.project.logger.LoggerFactory
;
import
com.x.base.core.project.tools.Crypto
;
import
com.x.base.core.project.tools.ListTools
;
import
org.apache.commons.lang3.StringUtils
;
import
java.io.DataInputStream
;
import
java.io.DataOutputStream
;
import
java.net.Socket
;
import
java.util.*
;
class
ActionGetSystemLog
extends
BaseAction
{
...
...
@@ -33,31 +37,34 @@ class ActionGetSystemLog extends BaseAction {
List
<
Wo
>
woList
=
new
ArrayList
<>();
String
key
=
effectivePerson
.
getDistinguishedName
();
if
(
key
.
indexOf
(
"@"
)
>
-
1
)
{
if
(
key
.
indexOf
(
"@"
)
>
-
1
)
{
key
=
key
.
split
(
"@"
)[
1
]
+
tag
;
}
if
(
Config
.
node
().
equals
(
Config
.
resource_node_centersPirmaryNode
()))
{
if
(
Config
.
node
().
equals
(
Config
.
resource_node_centersPirmaryNode
()))
{
woList
=
getSystemLog
(
key
);
}
else
{
List
<
NameValuePair
>
headers
=
ListTools
.
toList
(
new
NameValuePair
(
HttpToken
.
X_Token
,
effectivePerson
.
getToken
()));
woList
=
ConnectionAction
.
get
(
Config
.
url_x_program_center_jaxrs
(
"warnlog"
,
"view"
,
"system"
,
"log"
,
"tag"
,
tag
),
headers
).
getDataAsList
(
Wo
.
class
);
}
else
{
List
<
NameValuePair
>
headers
=
ListTools
.
toList
(
new
NameValuePair
(
Config
.
person
().
getTokenName
(),
effectivePerson
.
getToken
()));
woList
=
ConnectionAction
.
get
(
Config
.
url_x_program_center_jaxrs
(
"warnlog"
,
"view"
,
"system"
,
"log"
,
"tag"
,
tag
),
headers
)
.
getDataAsList
(
Wo
.
class
);
}
result
.
setData
(
woList
);
return
result
;
}
synchronized
private
List
<
Wo
>
getSystemLog
(
String
key
)
throws
Exception
{
synchronized
private
List
<
Wo
>
getSystemLog
(
String
key
)
throws
Exception
{
Nodes
nodes
=
Config
.
nodes
();
List
<
Wo
>
allLogs
=
new
ArrayList
<>();
for
(
String
node
:
nodes
.
keySet
()){
if
(
nodes
.
get
(
node
).
getApplication
().
getEnable
()
||
nodes
.
get
(
node
).
getCenter
().
getEnable
())
{
for
(
String
node
:
nodes
.
keySet
())
{
if
(
nodes
.
get
(
node
).
getApplication
().
getEnable
()
||
nodes
.
get
(
node
).
getCenter
().
getEnable
())
{
try
(
Socket
socket
=
new
Socket
(
node
,
nodes
.
get
(
node
).
nodeAgentPort
()))
{
socket
.
setKeepAlive
(
true
);
socket
.
setSoTimeout
(
5000
);
try
(
DataOutputStream
dos
=
new
DataOutputStream
(
socket
.
getOutputStream
());
DataInputStream
dis
=
new
DataInputStream
(
socket
.
getInputStream
()))
{
DataInputStream
dis
=
new
DataInputStream
(
socket
.
getInputStream
()))
{
Map
<
String
,
Object
>
commandObject
=
new
HashMap
<>();
commandObject
.
put
(
"command"
,
"readLog:readLog"
);
commandObject
.
put
(
"credential"
,
Crypto
.
rsaEncrypt
(
"o2@"
,
Config
.
publicKey
()));
...
...
@@ -77,19 +84,21 @@ class ActionGetSystemLog extends BaseAction {
dos
.
writeLong
(
lastPoint
);
dos
.
flush
();
//logger.debug("socket dispatch getSystemLog to {}:{} lastPoint={}", node, nodes.get(node).nodeAgentPort(), lastPoint);
// logger.debug("socket dispatch getSystemLog to {}:{} lastPoint={}", node,
// nodes.get(node).nodeAgentPort(), lastPoint);
String
result
=
dis
.
readUTF
();
if
(
StringUtils
.
isNotEmpty
(
result
)
&&
result
.
startsWith
(
"["
)){
List
<
Wo
>
list
=
gson
.
fromJson
(
result
,
new
TypeToken
<
List
<
Wo
>>(){}.
getType
());
if
(
StringUtils
.
isNotEmpty
(
result
)
&&
result
.
startsWith
(
"["
))
{
List
<
Wo
>
list
=
gson
.
fromJson
(
result
,
new
TypeToken
<
List
<
Wo
>>()
{
}.
getType
());
allLogs
.
addAll
(
list
);
long
returnLastPoint
=
dis
.
readLong
();
if
(
clo
==
null
)
{
if
(
clo
==
null
)
{
clo
=
new
CacheLogObject
();
clo
.
setUserToken
(
key
);
clo
.
setNode
(
node
);
clo
.
setLastPoint
(
returnLastPoint
);
}
else
{
}
else
{
clo
.
setLastPoint
(
returnLastPoint
);
}
CacheManager
.
put
(
cacheCategory
,
cacheKey
,
clo
);
...
...
@@ -97,7 +106,8 @@ class ActionGetSystemLog extends BaseAction {
}
}
catch
(
Exception
ex
)
{
logger
.
warn
(
"socket dispatch getSystemLog to {}:{} error={}"
,
node
,
nodes
.
get
(
node
).
nodeAgentPort
(),
ex
.
getMessage
());
logger
.
warn
(
"socket dispatch getSystemLog to {}:{} error={}"
,
node
,
nodes
.
get
(
node
).
nodeAgentPort
(),
ex
.
getMessage
());
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录