Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
sv-springboot
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
bsoft
sv-springboot
Commits
ae32db8e
Commit
ae32db8e
authored
Nov 11, 2020
by
whl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
第三方接口接受和返回token
parent
c578c466
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
421 additions
and
22 deletions
+421
-22
hs-admin/pom.xml
+1
-7
hs-api/pom.xml
+23
-14
hs-api/src/main/java/com/hs/api/common/aspect/TokenAspect.java
+11
-1
hs-api/src/main/java/com/hs/api/common/utils/HttpClientUtil.java
+78
-0
hs-api/src/main/java/com/hs/api/common/utils/JsonUtil.java
+227
-0
hs-api/src/main/java/com/hs/api/common/utils/TokenUtil.java
+36
-0
hs-api/src/main/java/com/hs/api/model/TokenProperties.java
+18
-0
hs-api/src/main/java/com/hs/api/model/TokenResult.java
+22
-0
hs-api/src/main/resources/application.properties
+5
-0
No files found.
hs-admin/pom.xml
View file @
ae32db8e
...
...
@@ -30,6 +30,7 @@
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<dependency>
<groupId>
org.mybatis.spring.boot
</groupId>
<artifactId>
mybatis-spring-boot-starter
</artifactId>
...
...
@@ -51,12 +52,6 @@
<scope>
runtime
</scope>
</dependency>
<dependency>
<groupId>
org.oracle
</groupId>
<artifactId>
ojdbc6
</artifactId>
<version>
6.0
</version>
</dependency>
<dependency>
<groupId>
org.aspectj
</groupId>
<artifactId>
aspectjrt
</artifactId>
<version>
1.9.4
</version>
...
...
@@ -65,7 +60,6 @@
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-tomcat
</artifactId>
...
...
hs-api/pom.xml
View file @
ae32db8e
...
...
@@ -31,7 +31,6 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
...
...
@@ -58,12 +57,6 @@
<scope>
runtime
</scope>
</dependency>
<dependency>
<groupId>
org.oracle
</groupId>
<artifactId>
ojdbc6
</artifactId>
<version>
6.0
</version>
</dependency>
<dependency>
<groupId>
org.aspectj
</groupId>
<artifactId>
aspectjrt
</artifactId>
<version>
1.9.4
</version>
...
...
@@ -72,7 +65,6 @@
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-tomcat
</artifactId>
...
...
@@ -89,7 +81,6 @@
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-thymeleaf
</artifactId>
</dependency>
<dependency>
<groupId>
me.chyxion
</groupId>
<artifactId>
table-to-xls
</artifactId>
...
...
@@ -107,6 +98,26 @@
<version>
1.18.10
</version>
<scope>
provided
</scope>
</dependency>
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpclient
</artifactId>
<version>
4.5
</version>
</dependency>
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpmime
</artifactId>
<version>
4.5
</version>
</dependency>
<dependency>
<groupId>
org.apache.httpcomponents
</groupId>
<artifactId>
httpcore
</artifactId>
<version>
4.4.1
</version>
</dependency>
<dependency>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.4
</version>
</dependency>
</dependencies>
<build>
...
...
@@ -135,11 +146,7 @@
<!--endregion-->
<!--region Oracle-->
<dependency>
<groupId>
org.oracle
</groupId>
<artifactId>
ojdbc6
</artifactId>
<version>
6.0
</version>
</dependency>
<!--endregion-->
<!--region mssql-->
...
...
@@ -169,6 +176,8 @@
</dependencies>
</plugin>
</plugins>
...
...
hs-api/src/main/java/com/hs/api/common/aspect/TokenAspect.java
View file @
ae32db8e
...
...
@@ -3,12 +3,14 @@ package com.hs.api.common.aspect;
import
com.hs.api.common.Constants
;
import
com.hs.api.common.exceptions.InvalidTokenException
;
import
com.hs.api.common.utils.TokenUtil
;
import
com.hs.api.model.TokenProperties
;
import
com.hs.common.utils.StringUtil
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.annotation.Pointcut
;
import
org.slf4j.Logger
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Profile
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
...
...
@@ -22,6 +24,9 @@ import javax.servlet.http.HttpServletRequest;
@Order
(
1
)
@Profile
({
"test"
,
"prod"
})
public
class
TokenAspect
{
@Autowired
TokenProperties
tokenProperties
;
@Pointcut
(
"@annotation(com.hs.api.common.annotations.Token)"
)
public
void
tokenAspect
()
{
}
...
...
@@ -30,10 +35,15 @@ public class TokenAspect {
public
Object
verifierToken
(
ProceedingJoinPoint
joinPoint
)
throws
Throwable
{
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
String
token
=
request
.
getHeader
(
Constants
.
TOKEN_KEY
);
if
(
tokenProperties
.
getInterfaceCheck
()){
if
(!
StringUtil
.
isNullOrEmpty
(
token
)
&&
TokenUtil
.
checkToken
(
token
,
tokenProperties
)){
return
joinPoint
.
proceed
();
}
}
else
{
if
(!
StringUtil
.
isNullOrEmpty
(
token
)
&&
TokenUtil
.
checkToken
(
token
)){
return
joinPoint
.
proceed
();
}
}
String
remoteHost
=
request
.
getRemoteHost
();
String
uri
=
request
.
getRequestURI
();
Logger
logger
=
org
.
slf4j
.
LoggerFactory
.
getLogger
(
joinPoint
.
getTarget
().
getClass
());
...
...
hs-api/src/main/java/com/hs/api/common/utils/HttpClientUtil.java
0 → 100644
View file @
ae32db8e
package
com
.
hs
.
api
.
common
.
utils
;
import
java.io.IOException
;
import
java.net.URI
;
import
com.hs.common.utils.StringUtil
;
import
org.apache.http.client.methods.CloseableHttpResponse
;
import
org.apache.http.client.methods.HttpGet
;
import
org.apache.http.client.utils.URIBuilder
;
import
org.apache.http.impl.client.CloseableHttpClient
;
import
org.apache.http.impl.client.HttpClients
;
import
org.apache.http.util.EntityUtils
;
import
com.hs.api.model.TokenResult
;
public
class
HttpClientUtil
{
/**
* 带参数的get请求
* @param url
* @return String
*/
public
static
String
doGet
(
String
url
)
{
// 创建Httpclient对象
CloseableHttpClient
httpclient
=
HttpClients
.
createDefault
();
String
resultString
=
""
;
CloseableHttpResponse
response
=
null
;
try
{
// 创建uri
URIBuilder
builder
=
new
URIBuilder
(
url
);
URI
uri
=
builder
.
build
();
// 创建http GET请求
HttpGet
httpGet
=
new
HttpGet
(
uri
);
// 执行请求
response
=
httpclient
.
execute
(
httpGet
);
// 判断返回状态是否为200
if
(
response
.
getStatusLine
().
getStatusCode
()
==
200
)
{
resultString
=
EntityUtils
.
toString
(
response
.
getEntity
(),
"UTF-8"
);
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
if
(
response
!=
null
)
{
response
.
close
();
}
httpclient
.
close
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
return
resultString
;
}
/**
* 医院接口校验token
* @param url
* @return boolean
*/
public
static
boolean
tokenCheck
(
String
url
){
System
.
out
.
println
(
"-----------------调用接口 token验证API BEGIN--------------->"
);
System
.
out
.
println
(
"请求url:"
+
url
);
boolean
match
=
false
;
//是否有效
try
{
String
result
=
HttpClientUtil
.
doGet
(
url
);
System
.
out
.
println
(
"请求结果:"
+
result
);
TokenResult
tokenResult
=
JsonUtil
.
parse
(
result
,
TokenResult
.
class
);
System
.
out
.
println
(
tokenResult
.
toString
());
if
(!
StringUtil
.
isNullOrEmpty
(
result
)
&&
!
tokenResult
.
getIsExpired
()){
TokenUtil
.
setToken
(
tokenResult
.
getKey
(),
tokenResult
);
match
=
true
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
System
.
out
.
println
(
"<-----------------调用接口 token验证API END---------------"
);
return
match
;
}
}
hs-api/src/main/java/com/hs/api/common/utils/JsonUtil.java
0 → 100644
View file @
ae32db8e
package
com
.
hs
.
api
.
common
.
utils
;
import
java.util.List
;
import
java.util.Map
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.alibaba.fastjson.serializer.PropertyFilter
;
import
com.alibaba.fastjson.serializer.SerializerFeature
;
public
class
JsonUtil
{
public
static
final
int
TYPE_FASTJSON
=
0
;
public
static
final
int
TYPE_GSON
=
1
;
/**
* <pre>
* 对象转化为json字符串
*
* @param obj 待转化对象
* @return 代表该对象的Json字符串
*/
public
static
final
String
toJson
(
final
Object
obj
)
{
return
JSON
.
toJSONString
(
obj
);
// return gson.toJson(obj);
}
/**
* <pre>
* 对象转化为json字符串
*
* @param obj 待转化对象
* @return 代表该对象的Json字符串
*/
public
static
final
String
toJson
(
final
Object
obj
,
SerializerFeature
...
features
)
{
return
JSON
.
toJSONString
(
obj
,
features
);
// return gson.toJson(obj);
}
/**
* 对象转化为json字符串并格式化
*
* @param obj
* @param format 是否要格式化
* @return
*/
public
static
final
String
toJson
(
final
Object
obj
,
final
boolean
format
)
{
return
JSON
.
toJSONString
(
obj
,
format
);
}
/**
* 对象对指定字段进行过滤处理,生成json字符串
*
* @param obj
* @param fields 过滤处理字段
* @param ignore true做忽略处理,false做包含处理
* @param features json特征,为null忽略
* @return
*/
public
static
final
String
toJson
(
final
Object
obj
,
final
String
[]
fields
,
final
boolean
ignore
,
SerializerFeature
...
features
)
{
if
(
fields
==
null
||
fields
.
length
<
1
)
{
return
toJson
(
obj
);
}
if
(
features
==
null
)
features
=
new
SerializerFeature
[]
{
SerializerFeature
.
QuoteFieldNames
};
return
JSON
.
toJSONString
(
obj
,
new
PropertyFilter
()
{
@Override
public
boolean
apply
(
Object
object
,
String
name
,
Object
value
)
{
for
(
int
i
=
0
;
i
<
fields
.
length
;
i
++)
{
if
(
name
.
equals
(
fields
[
i
]))
{
return
!
ignore
;
}
}
return
ignore
;
}
},
features
);
}
/**
* <pre>
* 解析json字符串中某路径的值
*
* @param json
* @param path
* @return
*/
@SuppressWarnings
(
"unchecked"
)
public
static
final
<
E
>
E
parse
(
final
String
json
,
final
String
path
)
{
String
[]
keys
=
path
.
split
(
","
);
JSONObject
obj
=
JSON
.
parseObject
(
json
);
for
(
int
i
=
0
;
i
<
keys
.
length
-
1
;
i
++)
{
obj
=
obj
.
getJSONObject
(
keys
[
i
]);
}
return
(
E
)
obj
.
get
(
keys
[
keys
.
length
-
1
]);
}
/**
* <pre>
* json字符串解析为对象
*
* @param json 代表一个对象的Json字符串
* @param clazz 指定目标对象的类型,即返回对象的类型
* @return 从json字符串解析出来的对象
*/
public
static
final
<
T
>
T
parse
(
final
String
json
,
final
Class
<
T
>
clazz
)
{
return
JSON
.
parseObject
(
json
,
clazz
);
}
/**
* <pre>
* json字符串解析为对象
*
* @param json json字符串
* @param path 逗号分隔的json层次结构
* @param clazz 目标类
*/
public
static
final
<
T
>
T
parse
(
final
String
json
,
final
String
path
,
final
Class
<
T
>
clazz
)
{
String
[]
keys
=
path
.
split
(
","
);
JSONObject
obj
=
JSON
.
parseObject
(
json
);
for
(
int
i
=
0
;
i
<
keys
.
length
-
1
;
i
++)
{
obj
=
obj
.
getJSONObject
(
keys
[
i
]);
}
String
inner
=
obj
.
getString
(
keys
[
keys
.
length
-
1
]);
return
parse
(
inner
,
clazz
);
}
/**
* 将制定的对象经过字段过滤处理后,解析成为json集合
*
* @param obj
* @param fields
* @param ignore
* @param clazz
* @param features
* @return
*/
public
static
final
<
T
>
List
<
T
>
parseArray
(
final
Object
obj
,
final
String
[]
fields
,
boolean
ignore
,
final
Class
<
T
>
clazz
,
final
SerializerFeature
...
features
)
{
String
json
=
toJson
(
obj
,
fields
,
ignore
,
features
);
return
parseArray
(
json
,
clazz
);
}
/**
* <pre>
* 从json字符串中解析出一个对象的集合,被解析字符串要求是合法的集合类型
* (形如:["k1":"v1","k2":"v2",..."kn":"vn"])
*
* @param json - [key-value-pair...]
* @param clazz
* @return
*/
public
static
final
<
T
>
List
<
T
>
parseArray
(
final
String
json
,
final
Class
<
T
>
clazz
)
{
return
JSON
.
parseArray
(
json
,
clazz
);
}
/**
* <pre>
* 从json字符串中按照路径寻找,并解析出一个对象的集合,例如:
* 类Person有一个属性name,要从以下json中解析出其集合:
* {
* "page_info":{
* "items":{
* "item":[{"name":"KelvinZ"},{"name":"Jobs"},...{"name":"Gates"}]
* }
* }
* 使用方法:parseArray(json, "page_info,items,item", Person.class),
* 将根据指定路径,正确的解析出所需集合,排除外层干扰
*
* @param json json字符串
* @param path 逗号分隔的json层次结构
* @param clazz 目标类
* @return
*/
public
static
final
<
T
>
List
<
T
>
parseArray
(
final
String
json
,
final
String
path
,
final
Class
<
T
>
clazz
)
{
String
[]
keys
=
path
.
split
(
","
);
JSONObject
obj
=
JSON
.
parseObject
(
json
);
for
(
int
i
=
0
;
i
<
keys
.
length
-
1
;
i
++)
{
obj
=
obj
.
getJSONObject
(
keys
[
i
]);
}
String
inner
=
obj
.
getString
(
keys
[
keys
.
length
-
1
]);
List
<
T
>
ret
=
parseArray
(
inner
,
clazz
);
return
ret
;
}
/**
* <pre>
* 有些json的常见格式错误这里可以处理,以便给后续的方法处理
* 常见错误:使用了\" 或者 "{ 或者 }",腾讯的页面中常见这种格式
*
* @param invalidJson 包含非法格式的json字符串
* @return
*/
public
static
final
String
correctJson
(
final
String
invalidJson
)
{
String
content
=
invalidJson
.
replace
(
"\\\""
,
"\""
).
replace
(
"\"{"
,
"{"
).
replace
(
"}\""
,
"}"
);
return
content
;
}
/**
* 格式化Json
*
* @param json
* @return
*/
public
static
final
String
formatJson
(
String
json
)
{
Map
<?,
?>
map
=
(
Map
<?,
?>)
JSON
.
parse
(
json
);
return
JSON
.
toJSONString
(
map
,
true
);
}
/**
* 获取json串中的子json
*
* @param json
* @param path
* @return
*/
public
static
final
String
getSubJson
(
String
json
,
String
path
)
{
String
[]
keys
=
path
.
split
(
","
);
JSONObject
obj
=
JSON
.
parseObject
(
json
);
for
(
int
i
=
0
;
i
<
keys
.
length
-
1
;
i
++)
{
obj
=
obj
.
getJSONObject
(
keys
[
i
]);
System
.
out
.
println
(
obj
.
toJSONString
());
}
return
obj
!=
null
?
obj
.
getString
(
keys
[
keys
.
length
-
1
])
:
null
;
}
}
hs-api/src/main/java/com/hs/api/common/utils/TokenUtil.java
View file @
ae32db8e
package
com
.
hs
.
api
.
common
.
utils
;
import
com.hs.api.model.SysUser
;
import
com.hs.api.model.TokenResult
;
import
com.hs.api.model.TokenProperties
;
import
com.hs.common.utils.JWTUtil
;
import
com.hs.common.utils.RedisUtil
;
public
class
TokenUtil
{
public
final
static
long
TOKEN_TIME_OUT
=
2L
*
60
*
60
;
public
final
static
long
OLD_TOKEN_DURATION
=
5L
*
60
;
// public final static String CHECK_TOKEN_URL = "http://192.192.192.97:8001/api/tokenapi/GetUser?token=";
/**
* 获取token,并将token存入redis
...
...
@@ -23,6 +26,20 @@ public class TokenUtil {
}
/**
* 将token存入redis
*
* @param token
* @param tr 返回结果
*/
public
static
void
setToken
(
String
token
,
TokenResult
tr
)
{
SysUser
user
=
new
SysUser
();
user
.
setId
(
1111L
);
user
.
setState
(
Short
.
parseShort
(
"1"
));
RedisUtil
.
set
(
token
,
user
,
TOKEN_TIME_OUT
);
}
/**
* 刷新token,并将旧token设置过期时间为5分钟
*
* @param oldToken 旧的token
...
...
@@ -52,4 +69,23 @@ public class TokenUtil {
}
return
result
;
}
/**
* 校验token
*
* @param token token
* @param tp 配置对象
* @return 返回校验结果
*/
public
static
boolean
checkToken
(
String
token
,
TokenProperties
tp
)
{
TokenUtil
tu
=
new
TokenUtil
();
SysUser
user
=
(
SysUser
)
RedisUtil
.
get
(
token
);
String
url
=
tp
.
getUrl
()
+
token
;
boolean
result
=
false
;
result
=
user
!=
null
||
HttpClientUtil
.
tokenCheck
(
url
);
if
(
result
){
RedisUtil
.
expire
(
token
,
TOKEN_TIME_OUT
);
}
return
result
;
}
}
hs-api/src/main/java/com/hs/api/model/TokenProperties.java
0 → 100644
View file @
ae32db8e
package
com
.
hs
.
api
.
model
;
import
lombok.Data
;
import
java.util.Date
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
@Data
@Component
public
class
TokenProperties
{
@Value
(
"${token.url}"
)
private
String
url
;
@Value
(
"${token.interface-check}"
)
private
Boolean
InterfaceCheck
;
}
\ No newline at end of file
hs-api/src/main/java/com/hs/api/model/TokenResult.java
0 → 100644
View file @
ae32db8e
package
com
.
hs
.
api
.
model
;
import
lombok.Data
;
import
java.util.Date
;
@Data
public
class
TokenResult
{
private
String
Key
;
private
Boolean
IsExpired
;
private
Date
RegistryTime
;
private
Date
LastActiveTime
;
private
Boolean
IsPersistent
;
private
Long
ExpireSlide
;
private
String
IP
;
private
String
PassWord
;
private
String
Identity
;
private
String
UserCode
;
private
String
UserName
;
}
\ No newline at end of file
hs-api/src/main/resources/application.properties
View file @
ae32db8e
...
...
@@ -21,3 +21,7 @@ spring.aop.proxy-target-class=false
spring.jmx.enabled
=
false
#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u05B6\uFFFD\u03AAnull\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0635\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD True\uFFFD\uFFFD\u02BE\uFFFD\uFFFD\uFFFD\uFFFD False\uFFFD\uFFFD\u02BE\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD
mybatis.configuration.call-setters-on-nulls
=
true
token.url
=
http://192.192.192.97:8001/api/tokenapi/GetUser?token=
token.interface-check
=
true
token.description
=
${token.url}'s${token.interface-check}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment