Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
JeeSpringCloud
Commits
05beecd0
Commit
05beecd0
authored
Nov 12, 2018
by
Huang
Browse files
no commit message
parent
bc5dd330
Changes
368
Hide whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
20 of 368+
files are displayed.
Plain diff
Email patch
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/redis/RedisConfig.java
0 → 100644
View file @
05beecd0
package
com.jeespring.common.redis
;
import
org.springframework.boot.autoconfigure.EnableAutoConfiguration
;
import
org.springframework.boot.context.properties.ConfigurationProperties
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.data.redis.connection.jedis.JedisConnectionFactory
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
redis.clients.jedis.JedisPoolConfig
;
@Configuration
@EnableAutoConfiguration
public
class
RedisConfig
{
//private static Logger logger = Logger.getLogger(RedisConfig.class);
@Bean
@ConfigurationProperties
(
prefix
=
"spring.redis"
)
public
JedisPoolConfig
getRedisConfig
(){
JedisPoolConfig
config
=
new
JedisPoolConfig
();
return
config
;
}
@Bean
@ConfigurationProperties
(
prefix
=
"spring.redis"
)
public
JedisConnectionFactory
getConnectionFactory
(){
JedisConnectionFactory
factory
=
new
JedisConnectionFactory
();
JedisPoolConfig
config
=
getRedisConfig
();
factory
.
setPoolConfig
(
config
);
//logger.info("JedisConnectionFactory bean init success.");
return
factory
;
}
@Bean
public
RedisTemplate
<?,
?>
getRedisTemplate
(){
RedisTemplate
<?,?>
template
=
new
StringRedisTemplate
(
getConnectionFactory
());
return
template
;
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/redis/RedisRestController.java
0 → 100644
View file @
05beecd0
package
com.jeespring.common.redis
;
import
com.jeespring.common.web.Result
;
import
com.jeespring.common.web.ResultFactory
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.ValueOperations
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.io.Serializable
;
import
java.util.Set
;
import
java.util.concurrent.TimeUnit
;
@RestController
@RequestMapping
(
"/rest/redis"
)
@Api
(
value
=
"Redis云数据缓存接口"
,
description
=
"Redis云数据缓存接口"
)
public
class
RedisRestController
{
@Autowired
private
RedisUtils
redisUtils
;
@RequestMapping
(
value
=
"/test"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis Test信息(Content-Type为text/html)"
,
notes
=
"Redis Test(Content-Type为text/html)"
)
public
String
test
(){
redisUtils
.
set
(
"Redis Test"
,
"Redis Test"
);
String
string
=
redisUtils
.
get
(
"Redis Test"
).
toString
();
return
string
;
}
/**
* 批量删除对应的value
*
* @param keys
*/
@RequestMapping
(
value
=
"/removeList"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis remove接口(Content-Type为text/html)"
,
notes
=
"Redis remove接口(Content-Type为text/html)"
)
public
Result
removeList
(
@RequestParam
(
required
=
false
)
String
keys
)
{
String
[]
keysList
=
keys
.
split
(
","
);
for
(
String
key:
keysList
)
{
redisUtils
.
remove
(
key
);
}
return
ResultFactory
.
getSuccessResult
(
"移除成功!"
);
}
/**
* 批量删除key
*
* @param pattern
*/
@RequestMapping
(
value
=
"/removePattern"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis remove pattern接口(Content-Type为text/html)"
,
notes
=
"Redis remove pattern接口接口(Content-Type为text/html)"
)
public
Result
removePattern
(
@RequestParam
(
required
=
false
)
String
pattern
)
{
redisUtils
.
removePattern
(
pattern
);
return
ResultFactory
.
getSuccessResult
(
"移除成功!"
);
}
@RequestMapping
(
value
=
"/removePatternShiroRedis"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis remove pattern Shiro Reids接口(Content-Type为text/html)"
,
notes
=
"Redis remove pattern Shiro Reids接口接口(Content-Type为text/html)"
)
public
Result
removePatternShiroReids
(
@RequestParam
(
required
=
false
)
String
pattern
)
{
redisUtils
.
removePatternShiroReids
(
pattern
);
return
ResultFactory
.
getSuccessResult
(
"移除成功!"
);
}
/**
* 删除对应的value
*
* @param key
*/
@RequestMapping
(
value
=
"/remove"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis remove接口(Content-Type为text/html)"
,
notes
=
"Redis remove接口(Content-Type为text/html)"
)
public
Result
remove
(
@RequestParam
(
required
=
false
)
String
key
)
{
redisUtils
.
remove
(
key
);
return
ResultFactory
.
getSuccessResult
(
"移除成功!"
);
}
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return
*/
@RequestMapping
(
value
=
"/exists"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis exists接口(Content-Type为text/html)"
,
notes
=
"Redis exists接口(Content-Type为text/html)"
)
public
Result
exists
(
@RequestParam
(
required
=
false
)
String
key
)
{
if
(
redisUtils
.
exists
(
key
))
{
return
ResultFactory
.
getSuccessResult
(
"存在!"
);
}
else
{
return
ResultFactory
.
getErrorResult
(
"不存在!"
);
}
}
/**
* 读取缓存
*
* @param key
* @return
*/
@RequestMapping
(
value
=
"/get"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis get接口(Content-Type为text/html)"
,
notes
=
"Redis get接口(Content-Type为text/html)"
)
public
Result
get
(
@RequestParam
(
required
=
false
)
String
key
)
{
if
(
redisUtils
.
exists
(
key
)){
Result
result
=
ResultFactory
.
getSuccessResult
();
Object
obj
=
redisUtils
.
get
(
key
);
if
(
obj
!=
null
)
{
result
.
setResultObject
(
obj
.
toString
());
}
return
result
;
}
else
{
return
ResultFactory
.
getErrorResult
(
"不存在!"
);
}
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
@RequestMapping
(
value
=
"/set"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis set接口(Content-Type为text/html)"
,
notes
=
"Redis set接口(Content-Type为text/html)"
)
public
Result
set
(
@RequestParam
(
required
=
false
)
String
key
,
@RequestParam
(
required
=
false
)
String
value
)
{
if
(
redisUtils
.
set
(
key
,
value
)){
Result
result
=
ResultFactory
.
getSuccessResult
(
"添加/更新成功!"
);
return
result
;
}
else
{
return
ResultFactory
.
getErrorResult
(
"添加/更新失败!"
);
}
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
@RequestMapping
(
value
=
"/setExpireTime"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis set expireTime接口(Content-Type为text/html)"
,
notes
=
"Redis set expireTime接口接口(Content-Type为text/html)"
)
public
Result
set
(
@RequestParam
(
required
=
false
)
String
key
,
@RequestParam
(
required
=
false
)
String
value
,
@RequestParam
(
required
=
false
)
Long
expireTime
)
{
if
(
redisUtils
.
set
(
key
,
value
,
expireTime
)){
Result
result
=
ResultFactory
.
getSuccessResult
(
"添加/更新成功!"
);
return
result
;
}
else
{
return
ResultFactory
.
getErrorResult
(
"添加/更新失败!"
);
}
}
/**
* 获取keys
*
* @param pattern
*/
@RequestMapping
(
value
=
"/getKyes"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis get kyes接口(Content-Type为text/html)"
,
notes
=
"Redis get kyes接口接口(Content-Type为text/html)"
)
public
Result
getKyes
(
@RequestParam
(
required
=
false
)
String
pattern
)
{
Set
<
String
>
keys
=
redisUtils
.
getKyes
(
pattern
);
Result
result
=
ResultFactory
.
getSuccessResult
(
"获取Keys成功!"
);
result
.
setResultObject
(
keys
);
return
result
;
}
@RequestMapping
(
value
=
"/getKyesAll"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis get kyes all接口(Content-Type为text/html)"
,
notes
=
"Redis get kyes all接口(Content-Type为text/html)"
)
public
Result
getKyesAll
()
{
Set
<
String
>
keys
=
redisUtils
.
getKyesAll
();
Result
result
=
ResultFactory
.
getSuccessResult
(
"获取Keys成功!"
);
result
.
setResultObject
(
keys
);
return
result
;
}
/**
* 获取keys
*
* @param pattern
*/
@RequestMapping
(
value
=
"/getCount"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis get count接口(Content-Type为text/html)"
,
notes
=
"Redis get count接口(Content-Type为text/html)"
)
public
Result
getCount
(
@RequestParam
(
required
=
false
)
String
pattern
)
{
Result
result
=
ResultFactory
.
getSuccessResult
(
"获取数量成功!"
);
result
.
setResultObject
(
redisUtils
.
getCount
());
return
result
;
}
@RequestMapping
(
value
=
"/getCountShiro"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis get count shiro接口(Content-Type为text/html)"
,
notes
=
"Redis get count shiro接口(Content-Type为text/html)"
)
public
Result
getCountShiro
(
@RequestParam
(
required
=
false
)
String
pattern
)
{
Result
result
=
ResultFactory
.
getSuccessResult
(
"获取数量成功!"
);
result
.
setResultObject
(
redisUtils
.
getCountShiro
());
return
result
;
}
/**
* 获取token的有效期(秒)
* @param key
*/
@RequestMapping
(
value
=
"/getExpireTime"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis get ExpireTime接口(Content-Type为text/html)"
,
notes
=
"Redis get ExpireTime接口接口(Content-Type为text/html)"
)
public
Result
getExpireTime
(
@RequestParam
(
required
=
false
)
String
key
){
Result
result
=
ResultFactory
.
getSuccessResult
(
"获取token的有效期(秒)成功!"
);
result
.
setResultObject
(
redisUtils
.
getExpireTime
(
key
));
return
result
;
}
/**
* 获取缓存有效期成功
*/
@RequestMapping
(
value
=
"/getExpire"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis get getExpire(Content-Type为text/html)"
,
notes
=
"Redis get getExpire(Content-Type为text/html)"
)
public
Result
getExpire
(){
Result
result
=
ResultFactory
.
getSuccessResult
(
"获取缓存有效期成功!"
);
result
.
setResultObject
(
RedisUtils
.
getExpire
());
return
result
;
}
/**
* 获取单点登录缓存有效期成功
*/
@RequestMapping
(
value
=
"/getExpireShiro"
,
method
={
RequestMethod
.
POST
,
RequestMethod
.
GET
})
@ApiOperation
(
value
=
"Redis get getExpireShiro(Content-Type为text/html)"
,
notes
=
"Redis get getExpireShiro(Content-Type为text/html)"
)
public
Result
getExpireShiro
(){
Result
result
=
ResultFactory
.
getSuccessResult
(
"获取单点登录缓存有效期成功!"
);
result
.
setResultObject
(
RedisUtils
.
getExpireShiro
());
return
result
;
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/redis/RedisUtils.java
0 → 100644
View file @
05beecd0
package
com.jeespring.common.redis
;
import
java.io.Serializable
;
import
java.util.HashSet
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Set
;
import
java.util.concurrent.TimeUnit
;
import
com.jeespring.common.config.Global
;
import
com.jeespring.common.security.MD5Tools
;
import
com.sun.tools.javac.util.Convert
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.data.redis.core.ValueOperations
;
import
org.springframework.stereotype.Component
;
import
redis.clients.jedis.Jedis
;
/**
* redicache 工具类
* 在application.yml文件内的Spring-redis的run配置启动,true为启动;false为不启动;
*/
@SuppressWarnings
(
"unchecked"
)
@Component
public
class
RedisUtils
{
/**
* 日志对象
*/
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
RedisUtils
.
class
);
public
static
String
SHIRO_REDIS
=
"shiro_redis_cache"
;
public
static
String
SHIRO_REDIS_OBJECT
=
"org.apache.shiro.subject.SimplePrincipalCollection"
;
public
static
String
GET_ID
=
".get id="
;
public
static
String
TOTAL_KEY
=
".total key="
;
public
static
String
FIND_LIST_KEY
=
".findList key="
;
public
static
String
FIND_LIST_FIRST_KEY
=
".findListFirst key="
;
public
static
String
FIND_PAGE_KEY
=
".findPage key="
;
public
static
String
FIND_LIST_KEY_PATTERN
=
".findList key=*"
;
public
static
String
FIND_LIST_FIRST_KEY_PATTERN
=
".findListFirst key=*"
;
public
static
String
FIND_PAGE_KEY_PATTERN
=
".findPage key=*"
;
public
static
String
KEY_PREFIX
=
Global
.
getConfig
(
"spring.redis.keyPrefix"
);
public
static
Long
expireTime
=
Long
.
parseLong
(
Global
.
getConfig
(
"spring.redis.expireTime"
));
public
static
Long
expireTimeShiro
=
Long
.
parseLong
(
Global
.
getConfig
(
"spring.redis.expireTimeShiro"
));
public
static
String
RUN_MESSAGE
=
"请开启Redis服务,还有Redis密码配置是否有误,而且密码不能为空(为空时Redis服务会连接不上)。"
;
@SuppressWarnings
(
"rawtypes"
)
@Autowired
private
RedisTemplate
redisTemplate
;
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
public
static
String
getExpire
(){
if
(
expireTime
!=
null
)
{
return
String
.
valueOf
(
expireTime
/
60
)
+
"分钟"
;
}
else
{
return
"0分钟"
;
}
}
public
static
String
getExpireShiro
(){
if
(
expireTimeShiro
!=
null
)
{
return
String
.
valueOf
(
expireTimeShiro
/
60
)
+
"分钟"
;
}
else
{
return
"0分钟"
;
}
}
public
static
String
getKey
(
String
className
,
String
keyName
,
String
keyId
){
if
(
className
==
null
){
className
=
""
;}
if
(
keyId
==
null
){
keyId
=
""
;}
return
RedisUtils
.
KEY_PREFIX
+
className
+
keyName
+
keyId
;
}
public
static
String
getIdKey
(
String
className
,
String
keyId
){
if
(
className
==
null
){
className
=
""
;}
if
(
keyId
==
null
){
keyId
=
""
;}
return
RedisUtils
.
KEY_PREFIX
+
className
+
RedisUtils
.
GET_ID
+
keyId
;
}
public
static
String
getTotalKey
(
String
className
,
String
keyId
){
if
(
className
==
null
){
className
=
""
;}
if
(
keyId
==
null
){
keyId
=
""
;}
return
RedisUtils
.
KEY_PREFIX
+
className
+
RedisUtils
.
TOTAL_KEY
+
MD5Tools
.
MD5
(
keyId
).
substring
(
0
,
20
);
}
public
static
String
getFindListKey
(
String
className
,
String
keyId
){
if
(
className
==
null
){
className
=
""
;}
if
(
keyId
==
null
){
keyId
=
""
;}
return
RedisUtils
.
KEY_PREFIX
+
className
+
RedisUtils
.
FIND_LIST_KEY
+
MD5Tools
.
MD5
(
keyId
).
substring
(
0
,
20
);
}
public
static
String
getFindListFirstKey
(
String
className
,
String
keyId
){
if
(
className
==
null
){
className
=
""
;}
if
(
keyId
==
null
){
keyId
=
""
;}
return
RedisUtils
.
KEY_PREFIX
+
className
+
RedisUtils
.
FIND_LIST_FIRST_KEY
+
MD5Tools
.
MD5
(
keyId
).
substring
(
0
,
20
);
}
public
static
String
getFindPageKey
(
String
className
,
String
keyId
){
if
(
className
==
null
){
className
=
""
;}
if
(
keyId
==
null
){
keyId
=
""
;}
return
RedisUtils
.
KEY_PREFIX
+
className
+
RedisUtils
.
FIND_PAGE_KEY
+
MD5Tools
.
MD5
(
keyId
).
substring
(
0
,
20
);
}
public
static
String
getFindListKeyPattern
(
String
className
){
if
(
className
==
null
){
className
=
""
;}
return
RedisUtils
.
KEY_PREFIX
+
className
+
FIND_LIST_KEY_PATTERN
;
}
public
static
String
getFinPageKeyPattern
(
String
className
){
if
(
className
==
null
){
className
=
""
;}
return
RedisUtils
.
KEY_PREFIX
+
className
+
FIND_PAGE_KEY_PATTERN
;
}
/**
* 获取token的有效期(秒)
* @param key
*/
public
long
getExpireTime
(
String
key
){
long
time
=
redisTemplate
.
getExpire
(
key
,
TimeUnit
.
SECONDS
);
return
time
;
}
/**
* 批量删除对应的value
*
* @param keys
*/
public
void
remove
(
final
String
...
keys
)
{
if
(!
run
())
{
return
;
}
try
{
for
(
String
key
:
keys
)
{
remove
(
key
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils remove:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
}
/**
* 批量删除key
*
* @param pattern
*/
public
void
removePattern
(
String
pattern
)
{
if
(!
run
())
{
return
;}
if
(!
listFlush
()){
return
;
}
try
{
if
(
pattern
==
null
)
{
pattern
=
""
;
}
Set
<
String
>
keys
=
getKyes
(
pattern
);
if
(
keys
.
size
()
>
0
)
{
redisTemplate
.
delete
(
keys
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils removePattern:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
}
public
void
removePatternShiroReids
(
String
pattern
){
if
(!
run
())
{
return
;}
if
(!
listFlush
()){
return
;
}
try
{
if
(
pattern
==
null
)
{
pattern
=
""
;
}
Set
<
String
>
keys
=
getKyesShiroReids
(
pattern
);
if
(
keys
.
size
()
>
0
){
stringRedisTemplate
.
delete
(
keys
);
redisTemplate
.
delete
(
keys
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils removePattern:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
}
/**
* 获取keys
*
* @param pattern
*/
public
Set
<
String
>
getKyes
(
String
pattern
)
{
if
(!
run
())
{
return
null
;
}
try
{
if
(
pattern
==
null
){
pattern
=
""
;
}
Set
<
String
>
keys
=
stringRedisTemplate
.
keys
(
"*"
+
pattern
);
Set
<
String
>
keysnew
=
new
HashSet
<
String
>();
Iterator
<
String
>
it
=
keys
.
iterator
();
while
(
it
.
hasNext
())
{
keysnew
.
add
(
it
.
next
().
substring
(
7
));
}
return
keysnew
;
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils getKyes:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
e
.
getMessage
());
return
null
;
}
}
public
Set
<
String
>
getKyesShiroReids
(
String
pattern
)
{
if
(!
run
())
{
return
null
;
}
try
{
if
(
pattern
==
null
){
pattern
=
""
;
}
Set
<
String
>
keys
=
stringRedisTemplate
.
keys
(
"*"
+
pattern
);
Set
<
String
>
keysnew
=
new
HashSet
<
String
>();
Iterator
<
String
>
it
=
keys
.
iterator
();
while
(
it
.
hasNext
())
{
String
tr
=
it
.
next
();
if
(
tr
.
contains
(
SHIRO_REDIS
))
{
keysnew
.
add
(
tr
);
}
else
if
(
tr
.
contains
(
SHIRO_REDIS_OBJECT
))
{
keysnew
.
add
(
tr
.
substring
(
8
));
}
}
return
keysnew
;
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils getKyes:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
e
.
getMessage
());
return
null
;
}
}
public
Set
<
String
>
getKyesAll
()
{
if
(!
run
())
{
return
null
;
}
try
{
Set
<
String
>
keys
=
stringRedisTemplate
.
keys
(
"*"
);
Set
<
String
>
keysnew
=
new
HashSet
<
String
>();
Iterator
<
String
>
it
=
keys
.
iterator
();
while
(
it
.
hasNext
())
{
keysnew
.
add
(
it
.
next
());
}
return
keysnew
;
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils getKyes:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
e
.
getMessage
());
return
null
;
}
}
/**
* 获取Count
*
*/
public
int
getCount
()
{
if
(!
run
())
{
return
0
;
}
try
{
Set
<
String
>
keys
=
stringRedisTemplate
.
keys
(
"*"
);
return
keys
.
size
();
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils getCount:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
e
.
getMessage
());
return
0
;
}
}
public
int
getCountShiro
()
{
if
(!
run
())
{
return
0
;
}
try
{
Set
<
String
>
keys
=
stringRedisTemplate
.
keys
(
SHIRO_REDIS
+
"*"
);
return
keys
.
size
();
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils getCount:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
e
.
getMessage
());
return
0
;
}
}
/**
* 删除对应的value
*
* @param key
*/
public
void
remove
(
final
String
key
)
{
if
(!
run
())
{
return
;
}
try
{
if
(
key
.
contains
(
SHIRO_REDIS
))
{
stringRedisTemplate
.
delete
(
key
);
}
else
{
redisTemplate
.
delete
(
key
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils exists:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
}
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return
*/
public
boolean
exists
(
final
String
key
)
{
if
(!
run
())
{
return
false
;
}
boolean
retuslt
=
false
;
try
{
if
(
key
.
contains
(
SHIRO_REDIS
))
{
retuslt
=
stringRedisTemplate
.
hasKey
(
key
);
}
else
{
retuslt
=
redisTemplate
.
hasKey
(
key
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils exists:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
return
retuslt
;
}
/**
* 读取缓存
*
* @param key
* @return
*/
public
Object
get
(
final
String
key
)
{
if
(!
run
())
{
return
null
;
}
Object
result
=
null
;
try
{
if
(
key
.
contains
(
SHIRO_REDIS
)){
ValueOperations
<
String
,
String
>
operationsString
=
stringRedisTemplate
.
opsForValue
();
result
=
operationsString
.
get
(
key
);
}
else
{
ValueOperations
<
Serializable
,
Object
>
operations
=
redisTemplate
.
opsForValue
();
result
=
operations
.
get
(
key
);
}
return
result
;
}
catch
(
Exception
e
){
logger
.
error
(
"RedisUtils get:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
return
result
;
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
public
boolean
set
(
final
String
key
,
Object
value
)
{
if
(!
run
())
{
return
false
;
}
boolean
result
=
false
;
try
{
ValueOperations
<
Serializable
,
Object
>
operations
=
redisTemplate
.
opsForValue
();
operations
.
set
(
key
,
value
);
redisTemplate
.
expire
(
key
,
expireTime
,
TimeUnit
.
SECONDS
);
result
=
true
;
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils set:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
return
result
;
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
public
boolean
set
(
final
String
key
,
Object
value
,
Long
expireTime
)
{
if
(!
run
())
{
return
false
;
}
boolean
result
=
false
;
try
{
ValueOperations
<
Serializable
,
Object
>
operations
=
redisTemplate
.
opsForValue
();
operations
.
set
(
key
,
value
);
redisTemplate
.
expire
(
key
,
expireTime
,
TimeUnit
.
SECONDS
);
result
=
true
;
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils set:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
return
result
;
}
public
boolean
set
(
final
String
key
,
Object
value
,
Long
expireTime
,
TimeUnit
unit
)
{
if
(!
run
())
{
return
false
;
}
boolean
result
=
false
;
try
{
ValueOperations
<
Serializable
,
Object
>
operations
=
redisTemplate
.
opsForValue
();
operations
.
set
(
key
,
value
);
redisTemplate
.
expire
(
key
,
expireTime
,
unit
);
result
=
true
;
}
catch
(
Exception
e
)
{
logger
.
error
(
"RedisUtils set:"
+
RUN_MESSAGE
+
e
.
getMessage
(),
RUN_MESSAGE
+
e
.
getMessage
());
}
return
result
;
}
private
boolean
run
(){
if
(
Global
.
getConfig
(
"spring.redis.run"
)==
"true"
)
{
return
true
;
}
return
false
;
}
public
static
boolean
isRun
(){
if
(
Global
.
getConfig
(
"spring.redis.run"
)==
"true"
)
{
return
true
;
}
return
false
;
}
public
static
boolean
isShireRedis
(){
if
(
Global
.
getConfig
(
"spring.redis.run"
)!=
"true"
)
{
return
false
;
}
if
(
Global
.
getConfig
(
"shiro.redis"
)!=
"true"
)
{
return
false
;
}
return
true
;
}
private
boolean
listFlush
(){
if
(
Global
.
getConfig
(
"spring.redis.listFlush"
)==
"true"
)
{
return
true
;
}
return
false
;
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/Cryptos.java
0 → 100644
View file @
05beecd0
/**
* Copyright (c) 2005-2012 springside.org.cn
*/
package
com.jeespring.common.security
;
import
java.io.UnsupportedEncodingException
;
import
java.security.GeneralSecurityException
;
import
java.security.SecureRandom
;
import
java.util.Arrays
;
import
javax.crypto.Cipher
;
import
javax.crypto.KeyGenerator
;
import
javax.crypto.Mac
;
import
javax.crypto.SecretKey
;
import
javax.crypto.spec.IvParameterSpec
;
import
javax.crypto.spec.SecretKeySpec
;
import
com.jeespring.common.utils.Encodes
;
import
com.jeespring.common.utils.Exceptions
;
/**
* 支持HMAC-SHA1消息签名 及 DES/AES对称加密的工具类.
*
* 支持Hex与Base64两种编码方式.
*
* @author calvin
*/
public
class
Cryptos
{
private
static
final
String
AES
=
"AES"
;
private
static
final
String
AES_CBC
=
"AES/CBC/PKCS5Padding"
;
private
static
final
String
HMACSHA1
=
"HmacSHA1"
;
private
static
final
String
DEFAULT_URL_ENCODING
=
"UTF-8"
;
private
static
final
int
DEFAULT_HMACSHA1_KEYSIZE
=
160
;
//RFC2401
private
static
final
int
DEFAULT_AES_KEYSIZE
=
128
;
private
static
final
int
DEFAULT_IVSIZE
=
16
;
private
static
final
byte
[]
DEFAULT_KEY
=
new
byte
[]{-
97
,
88
,-
94
,
9
,
70
,-
76
,
126
,
25
,
0
,
3
,-
20
,
113
,
108
,
28
,
69
,
125
};
private
static
SecureRandom
random
=
new
SecureRandom
();
//-- HMAC-SHA1 funciton --//
/**
* 使用HMAC-SHA1进行消息签名, 返回字节数组,长度为20字节.
*
* @param input 原始输入字符数组
* @param key HMAC-SHA1密钥
*/
public
static
byte
[]
hmacSha1
(
byte
[]
input
,
byte
[]
key
)
{
try
{
SecretKey
secretKey
=
new
SecretKeySpec
(
key
,
HMACSHA1
);
Mac
mac
=
Mac
.
getInstance
(
HMACSHA1
);
mac
.
init
(
secretKey
);
return
mac
.
doFinal
(
input
);
}
catch
(
GeneralSecurityException
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
/**
* 校验HMAC-SHA1签名是否正确.
*
* @param expected 已存在的签名
* @param input 原始输入字符串
* @param key 密钥
*/
public
static
boolean
isMacValid
(
byte
[]
expected
,
byte
[]
input
,
byte
[]
key
)
{
byte
[]
actual
=
hmacSha1
(
input
,
key
);
return
Arrays
.
equals
(
expected
,
actual
);
}
/**
* 生成HMAC-SHA1密钥,返回字节数组,长度为160位(20字节).
* HMAC-SHA1算法对密钥无特殊要求, RFC2401建议最少长度为160位(20字节).
*/
public
static
byte
[]
generateHmacSha1Key
()
{
try
{
KeyGenerator
keyGenerator
=
KeyGenerator
.
getInstance
(
HMACSHA1
);
keyGenerator
.
init
(
DEFAULT_HMACSHA1_KEYSIZE
);
SecretKey
secretKey
=
keyGenerator
.
generateKey
();
return
secretKey
.
getEncoded
();
}
catch
(
GeneralSecurityException
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
//-- AES funciton --//
/**
* 使用AES加密原始字符串.
*
* @param input 原始输入字符数组
*/
public
static
String
aesEncrypt
(
String
input
)
{
try
{
return
Encodes
.
encodeHex
(
aesEncrypt
(
input
.
getBytes
(
DEFAULT_URL_ENCODING
),
DEFAULT_KEY
));
}
catch
(
UnsupportedEncodingException
e
)
{
return
""
;
}
}
/**
* 使用AES加密原始字符串.
*
* @param input 原始输入字符数组
* @param key 符合AES要求的密钥
*/
public
static
String
aesEncrypt
(
String
input
,
String
key
)
{
try
{
return
Encodes
.
encodeHex
(
aesEncrypt
(
input
.
getBytes
(
DEFAULT_URL_ENCODING
),
Encodes
.
decodeHex
(
key
)));
}
catch
(
UnsupportedEncodingException
e
)
{
return
""
;
}
}
/**
* 使用AES加密原始字符串.
*
* @param input 原始输入字符数组
* @param key 符合AES要求的密钥
*/
public
static
byte
[]
aesEncrypt
(
byte
[]
input
,
byte
[]
key
)
{
return
aes
(
input
,
key
,
Cipher
.
ENCRYPT_MODE
);
}
/**
* 使用AES加密原始字符串.
*
* @param input 原始输入字符数组
* @param key 符合AES要求的密钥
* @param iv 初始向量
*/
public
static
byte
[]
aesEncrypt
(
byte
[]
input
,
byte
[]
key
,
byte
[]
iv
)
{
return
aes
(
input
,
key
,
iv
,
Cipher
.
ENCRYPT_MODE
);
}
/**
* 使用AES解密字符串, 返回原始字符串.
*
* @param input Hex编码的加密字符串
*/
public
static
String
aesDecrypt
(
String
input
)
{
try
{
return
new
String
(
aesDecrypt
(
Encodes
.
decodeHex
(
input
),
DEFAULT_KEY
),
DEFAULT_URL_ENCODING
);
}
catch
(
UnsupportedEncodingException
e
)
{
return
""
;
}
}
/**
* 使用AES解密字符串, 返回原始字符串.
*
* @param input Hex编码的加密字符串
* @param key 符合AES要求的密钥
*/
public
static
String
aesDecrypt
(
String
input
,
String
key
)
{
try
{
return
new
String
(
aesDecrypt
(
Encodes
.
decodeHex
(
input
),
Encodes
.
decodeHex
(
key
)),
DEFAULT_URL_ENCODING
);
}
catch
(
UnsupportedEncodingException
e
)
{
return
""
;
}
}
/**
* 使用AES解密字符串, 返回原始字符串.
*
* @param input Hex编码的加密字符串
* @param key 符合AES要求的密钥
*/
public
static
byte
[]
aesDecrypt
(
byte
[]
input
,
byte
[]
key
)
{
return
aes
(
input
,
key
,
Cipher
.
DECRYPT_MODE
);
}
/**
* 使用AES解密字符串, 返回原始字符串.
*
* @param input Hex编码的加密字符串
* @param key 符合AES要求的密钥
* @param iv 初始向量
*/
public
static
byte
[]
aesDecrypt
(
byte
[]
input
,
byte
[]
key
,
byte
[]
iv
)
{
return
aes
(
input
,
key
,
iv
,
Cipher
.
DECRYPT_MODE
);
}
/**
* 使用AES加密或解密无编码的原始字节数组, 返回无编码的字节数组结果.
*
* @param input 原始字节数组
* @param key 符合AES要求的密钥
* @param mode Cipher.ENCRYPT_MODE 或 Cipher.DECRYPT_MODE
*/
private
static
byte
[]
aes
(
byte
[]
input
,
byte
[]
key
,
int
mode
)
{
try
{
SecretKey
secretKey
=
new
SecretKeySpec
(
key
,
AES
);
Cipher
cipher
=
Cipher
.
getInstance
(
AES
);
cipher
.
init
(
mode
,
secretKey
);
return
cipher
.
doFinal
(
input
);
}
catch
(
GeneralSecurityException
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
/**
* 使用AES加密或解密无编码的原始字节数组, 返回无编码的字节数组结果.
*
* @param input 原始字节数组
* @param key 符合AES要求的密钥
* @param iv 初始向量
* @param mode Cipher.ENCRYPT_MODE 或 Cipher.DECRYPT_MODE
*/
private
static
byte
[]
aes
(
byte
[]
input
,
byte
[]
key
,
byte
[]
iv
,
int
mode
)
{
try
{
SecretKey
secretKey
=
new
SecretKeySpec
(
key
,
AES
);
IvParameterSpec
ivSpec
=
new
IvParameterSpec
(
iv
);
Cipher
cipher
=
Cipher
.
getInstance
(
AES_CBC
);
cipher
.
init
(
mode
,
secretKey
,
ivSpec
);
return
cipher
.
doFinal
(
input
);
}
catch
(
GeneralSecurityException
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
/**
* 生成AES密钥,返回字节数组, 默认长度为128位(16字节).
*/
public
static
String
generateAesKeyString
()
{
return
Encodes
.
encodeHex
(
generateAesKey
(
DEFAULT_AES_KEYSIZE
));
}
/**
* 生成AES密钥,返回字节数组, 默认长度为128位(16字节).
*/
public
static
byte
[]
generateAesKey
()
{
return
generateAesKey
(
DEFAULT_AES_KEYSIZE
);
}
/**
* 生成AES密钥,可选长度为128,192,256位.
*/
public
static
byte
[]
generateAesKey
(
int
keysize
)
{
try
{
KeyGenerator
keyGenerator
=
KeyGenerator
.
getInstance
(
AES
);
keyGenerator
.
init
(
keysize
);
SecretKey
secretKey
=
keyGenerator
.
generateKey
();
return
secretKey
.
getEncoded
();
}
catch
(
GeneralSecurityException
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
/**
* 生成随机向量,默认大小为cipher.getBlockSize(), 16字节.
*/
public
static
byte
[]
generateIV
()
{
byte
[]
bytes
=
new
byte
[
DEFAULT_IVSIZE
];
random
.
nextBytes
(
bytes
);
return
bytes
;
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/Digests.java
0 → 100644
View file @
05beecd0
/**
* Copyright (c) 2005-2012 springside.org.cn
*/
package
com.jeespring.common.security
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.security.GeneralSecurityException
;
import
java.security.MessageDigest
;
import
java.security.SecureRandom
;
import
org.apache.commons.lang3.Validate
;
import
com.jeespring.common.utils.Exceptions
;
/**
* 支持SHA-1/MD5消息摘要的工具类.
*
* 返回ByteSource,可进一步被编码为Hex, Base64或UrlSafeBase64
*
* @author JeeSpring
*/
public
class
Digests
{
private
static
final
String
SHA1
=
"SHA-1"
;
private
static
final
String
MD5
=
"MD5"
;
private
static
SecureRandom
random
=
new
SecureRandom
();
/**
* 对输入字符串进行md5散列.
*/
public
static
byte
[]
md5
(
byte
[]
input
)
{
return
digest
(
input
,
MD5
,
null
,
1
);
}
public
static
byte
[]
md5
(
byte
[]
input
,
int
iterations
)
{
return
digest
(
input
,
MD5
,
null
,
iterations
);
}
/**
* 对输入字符串进行sha1散列.
*/
public
static
byte
[]
sha1
(
byte
[]
input
)
{
return
digest
(
input
,
SHA1
,
null
,
1
);
}
public
static
byte
[]
sha1
(
byte
[]
input
,
byte
[]
salt
)
{
return
digest
(
input
,
SHA1
,
salt
,
1
);
}
public
static
byte
[]
sha1
(
byte
[]
input
,
byte
[]
salt
,
int
iterations
)
{
return
digest
(
input
,
SHA1
,
salt
,
iterations
);
}
/**
* 对字符串进行散列, 支持md5与sha1算法.
*/
private
static
byte
[]
digest
(
byte
[]
input
,
String
algorithm
,
byte
[]
salt
,
int
iterations
)
{
try
{
MessageDigest
digest
=
MessageDigest
.
getInstance
(
algorithm
);
if
(
salt
!=
null
)
{
digest
.
update
(
salt
);
}
byte
[]
result
=
digest
.
digest
(
input
);
for
(
int
i
=
1
;
i
<
iterations
;
i
++)
{
digest
.
reset
();
result
=
digest
.
digest
(
result
);
}
return
result
;
}
catch
(
GeneralSecurityException
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
/**
* 生成随机的Byte[]作为salt.
*
* @param numBytes byte数组的大小
*/
public
static
byte
[]
generateSalt
(
int
numBytes
)
{
Validate
.
isTrue
(
numBytes
>
0
,
"numBytes argument must be a positive integer (1 or larger)"
,
numBytes
);
byte
[]
bytes
=
new
byte
[
numBytes
];
random
.
nextBytes
(
bytes
);
return
bytes
;
}
/**
* 对文件进行md5散列.
*/
public
static
byte
[]
md5
(
InputStream
input
)
throws
IOException
{
return
digest
(
input
,
MD5
);
}
/**
* 对文件进行sha1散列.
*/
public
static
byte
[]
sha1
(
InputStream
input
)
throws
IOException
{
return
digest
(
input
,
SHA1
);
}
private
static
byte
[]
digest
(
InputStream
input
,
String
algorithm
)
throws
IOException
{
try
{
MessageDigest
messageDigest
=
MessageDigest
.
getInstance
(
algorithm
);
int
bufferLength
=
8
*
1024
;
byte
[]
buffer
=
new
byte
[
bufferLength
];
int
read
=
input
.
read
(
buffer
,
0
,
bufferLength
);
while
(
read
>
-
1
)
{
messageDigest
.
update
(
buffer
,
0
,
read
);
read
=
input
.
read
(
buffer
,
0
,
bufferLength
);
}
return
messageDigest
.
digest
();
}
catch
(
GeneralSecurityException
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
public
static
String
string2MD5
(
String
inStr
){
MessageDigest
md5
=
null
;
try
{
md5
=
MessageDigest
.
getInstance
(
"MD5"
);
}
catch
(
Exception
e
){
System
.
out
.
println
(
e
.
toString
());
e
.
printStackTrace
();
return
""
;
}
char
[]
charArray
=
inStr
.
toCharArray
();
byte
[]
byteArray
=
new
byte
[
charArray
.
length
];
for
(
int
i
=
0
;
i
<
charArray
.
length
;
i
++)
{
byteArray
[
i
]
=
(
byte
)
charArray
[
i
];
}
byte
[]
md5Bytes
=
md5
.
digest
(
byteArray
);
StringBuffer
hexValue
=
new
StringBuffer
();
for
(
int
i
=
0
;
i
<
md5Bytes
.
length
;
i
++){
int
val
=
((
int
)
md5Bytes
[
i
])
&
0xff
;
if
(
val
<
16
)
{
hexValue
.
append
(
"0"
);
}
hexValue
.
append
(
Integer
.
toHexString
(
val
));
}
return
hexValue
.
toString
();
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/MD5Tools.java
0 → 100644
View file @
05beecd0
package
com.jeespring.common.security
;
import
java.security.MessageDigest
;
/**
* MD5加密工具类
* <功能详细描述>
*
* @author chenlujun
* @version [版本号, 2014年10月1日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public
class
MD5Tools
{
public
final
static
String
MD5
(
String
pwd
)
{
//用于加密的字符
char
[]
md5String
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
};
try
{
//使用平台的默认字符集将此 String 编码为 byte序列,并将结果存储到一个新的 byte数组中
byte
[]
btInput
=
pwd
.
getBytes
();
//信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
MessageDigest
mdInst
=
MessageDigest
.
getInstance
(
"MD5"
);
//MessageDigest对象通过使用 update方法处理数据, 使用指定的byte数组更新摘要
mdInst
.
update
(
btInput
);
// 摘要更新之后,通过调用digest()执行哈希计算,获得密文
byte
[]
md
=
mdInst
.
digest
();
// 把密文转换成十六进制的字符串形式
int
j
=
md
.
length
;
char
[]
str
=
new
char
[
j
*
2
];
int
k
=
0
;
for
(
int
i
=
0
;
i
<
j
;
i
++)
{
// i = 0
byte
byte0
=
md
[
i
];
//95
str
[
k
++]
=
md5String
[
byte0
>>>
4
&
0xf
];
// 5
str
[
k
++]
=
md5String
[
byte0
&
0xf
];
// F
}
//返回经过加密后的字符串
return
new
String
(
str
);
}
catch
(
Exception
e
)
{
return
null
;
}
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/ShiroUtils.java
0 → 100644
View file @
05beecd0
package
com.jeespring.common.security
;
import
com.jeespring.modules.sys.entity.User
;
import
com.jeespring.modules.sys.entity.UserRealm
;
import
org.apache.shiro.SecurityUtils
;
import
org.apache.shiro.mgt.RealmSecurityManager
;
import
org.apache.shiro.session.Session
;
import
org.apache.shiro.subject.PrincipalCollection
;
import
org.apache.shiro.subject.SimplePrincipalCollection
;
import
org.apache.shiro.subject.Subject
;
import
com.jeespring.common.utils.StringUtils
;
import
com.jeespring.common.utils.bean.BeanUtils
;
/**
* shiro 工具类
*
* @author JeeSpring
*/
public
class
ShiroUtils
{
public
static
Subject
getSubjct
()
{
return
SecurityUtils
.
getSubject
();
}
public
static
Session
getSession
()
{
return
SecurityUtils
.
getSubject
().
getSession
();
}
public
static
void
logout
()
{
getSubjct
().
logout
();
}
public
static
User
getUser
()
{
User
user
=
null
;
Object
obj
=
getSubjct
().
getPrincipal
();
if
(
StringUtils
.
isNotNull
(
obj
))
{
user
=
new
User
();
BeanUtils
.
copyBeanProp
(
user
,
obj
);
}
return
user
;
}
public
static
void
setUser
(
User
user
)
{
Subject
subject
=
getSubjct
();
PrincipalCollection
principalCollection
=
subject
.
getPrincipals
();
String
realmName
=
principalCollection
.
getRealmNames
().
iterator
().
next
();
PrincipalCollection
newPrincipalCollection
=
new
SimplePrincipalCollection
(
user
,
realmName
);
// 重新加载Principal
subject
.
runAs
(
newPrincipalCollection
);
}
public
static
void
clearCachedAuthorizationInfo
()
{
RealmSecurityManager
rsm
=
(
RealmSecurityManager
)
SecurityUtils
.
getSecurityManager
();
UserRealm
realm
=
(
UserRealm
)
rsm
.
getRealms
().
iterator
().
next
();
realm
.
clearCachedAuthorizationInfo
();
}
public
static
Long
getUserId
()
{
return
Long
.
valueOf
(
getUser
().
getId
());
}
public
static
String
getLoginName
()
{
return
getUser
().
getLoginName
();
}
public
static
String
getIp
()
{
return
getSubjct
().
getSession
().
getHost
();
}
public
static
String
getSessionId
()
{
return
String
.
valueOf
(
getSubjct
().
getSession
().
getId
());
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/shiro/HasAnyPermissionsTag.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.security.shiro
;
import
org.apache.shiro.subject.Subject
;
import
org.apache.shiro.web.tags.PermissionTag
;
/**
* Shiro HasAnyPermissions Tag.
*
* @author calvin
*/
public
class
HasAnyPermissionsTag
extends
PermissionTag
{
private
static
final
long
serialVersionUID
=
1L
;
private
static
final
String
PERMISSION_NAMES_DELIMETER
=
","
;
@Override
protected
boolean
showTagBody
(
String
permissionNames
)
{
boolean
hasAnyPermission
=
false
;
Subject
subject
=
getSubject
();
if
(
subject
!=
null
)
{
// Iterate through permissions and check to see if the user has one of the permissions
for
(
String
permission
:
permissionNames
.
split
(
PERMISSION_NAMES_DELIMETER
))
{
if
(
subject
.
isPermitted
(
permission
.
trim
()))
{
hasAnyPermission
=
true
;
break
;
}
}
}
return
hasAnyPermission
;
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/shiro/cache/SessionCacheManager.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.security.shiro.cache
;
import
java.util.Collection
;
import
java.util.Collections
;
import
java.util.Set
;
import
javax.servlet.http.HttpServletRequest
;
import
org.apache.shiro.SecurityUtils
;
import
org.apache.shiro.UnavailableSecurityManagerException
;
import
org.apache.shiro.cache.Cache
;
import
org.apache.shiro.cache.CacheException
;
import
org.apache.shiro.cache.CacheManager
;
import
org.apache.shiro.session.InvalidSessionException
;
import
org.apache.shiro.session.Session
;
import
org.apache.shiro.subject.Subject
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.google.common.collect.Sets
;
import
com.jeespring.common.web.Servlets
;
/**
* 自定义授权缓存管理类
* @author 黄炳桂 516821420@qq.com
* @version 2014-7-21
*/
public
class
SessionCacheManager
implements
CacheManager
{
@Override
public
<
K
,
V
>
Cache
<
K
,
V
>
getCache
(
String
name
)
throws
CacheException
{
return
new
SessionCache
<
K
,
V
>(
name
);
}
/**
* SESSION缓存管理类
*/
public
class
SessionCache
<
K
,
V
>
implements
Cache
<
K
,
V
>
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
getClass
());
private
String
cacheKeyName
=
null
;
public
SessionCache
(
String
cacheKeyName
)
{
this
.
cacheKeyName
=
cacheKeyName
;
}
public
Session
getSession
(){
Session
session
=
null
;
try
{
Subject
subject
=
SecurityUtils
.
getSubject
();
session
=
subject
.
getSession
(
false
);
if
(
session
==
null
){
session
=
subject
.
getSession
();
}
}
catch
(
InvalidSessionException
e
){
logger
.
error
(
"Invalid session error"
,
e
);
}
catch
(
UnavailableSecurityManagerException
e2
){
logger
.
error
(
"Unavailable SecurityManager error"
,
e2
);
}
return
session
;
}
@SuppressWarnings
(
"unchecked"
)
@Override
public
V
get
(
K
key
)
throws
CacheException
{
if
(
key
==
null
){
return
null
;
}
V
v
=
null
;
HttpServletRequest
request
=
Servlets
.
getRequest
();
if
(
request
!=
null
){
v
=
(
V
)
request
.
getAttribute
(
cacheKeyName
);
if
(
v
!=
null
){
return
v
;
}
}
V
value
=
null
;
value
=
(
V
)
getSession
().
getAttribute
(
cacheKeyName
);
logger
.
debug
(
"get {} {} {}"
,
cacheKeyName
,
key
,
request
!=
null
?
request
.
getRequestURI
()
:
""
);
if
(
request
!=
null
&&
value
!=
null
){
request
.
setAttribute
(
cacheKeyName
,
value
);
}
return
value
;
}
@Override
public
V
put
(
K
key
,
V
value
)
throws
CacheException
{
if
(
key
==
null
){
return
null
;
}
getSession
().
setAttribute
(
cacheKeyName
,
value
);
if
(
logger
.
isDebugEnabled
()){
HttpServletRequest
request
=
Servlets
.
getRequest
();
logger
.
debug
(
"put {} {} {}"
,
cacheKeyName
,
key
,
request
!=
null
?
request
.
getRequestURI
()
:
""
);
}
return
value
;
}
@SuppressWarnings
(
"unchecked"
)
@Override
public
V
remove
(
K
key
)
throws
CacheException
{
V
value
=
null
;
value
=
(
V
)
getSession
().
removeAttribute
(
cacheKeyName
);
logger
.
debug
(
"remove {} {}"
,
cacheKeyName
,
key
);
return
value
;
}
@Override
public
void
clear
()
throws
CacheException
{
getSession
().
removeAttribute
(
cacheKeyName
);
logger
.
debug
(
"clear {}"
,
cacheKeyName
);
}
@Override
public
int
size
()
{
logger
.
debug
(
"invoke session size abstract size method not supported."
);
return
0
;
}
@Override
public
Set
<
K
>
keys
()
{
logger
.
debug
(
"invoke session keys abstract size method not supported."
);
return
Sets
.
newHashSet
();
}
@Override
public
Collection
<
V
>
values
()
{
logger
.
debug
(
"invoke session values abstract size method not supported."
);
return
Collections
.
emptyList
();
}
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/shiro/session/CacheSessionDAO.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.security.shiro.session
;
import
java.io.Serializable
;
import
java.util.Collection
;
import
java.util.Set
;
import
javax.servlet.http.HttpServletRequest
;
import
org.apache.shiro.cache.CacheManager
;
import
org.apache.shiro.session.Session
;
import
org.apache.shiro.session.UnknownSessionException
;
import
org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
;
import
org.apache.shiro.subject.PrincipalCollection
;
import
org.apache.shiro.subject.support.DefaultSubjectContext
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.InitializingBean
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
com.google.common.collect.Sets
;
import
com.jeespring.common.config.Global
;
import
com.jeespring.common.utils.DateUtils
;
import
com.jeespring.common.utils.IdGen
;
import
com.jeespring.common.utils.StringUtils
;
import
com.jeespring.common.web.Servlets
;
/**
* 系统安全认证实现类
* @author 黄炳桂 516821420@qq.com
* @version 2014-7-24
*/
@Component
(
"sessionDAO"
)
public
class
CacheSessionDAO
extends
EnterpriseCacheSessionDAO
implements
SessionDAO
,
InitializingBean
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
getClass
());
@Autowired
private
IdGen
idgen
;
@Autowired
private
CacheManager
cacheManager
;
@Override
public
void
afterPropertiesSet
()
throws
Exception
{
setSessionIdGenerator
(
idgen
);
setActiveSessionsCacheName
(
"activeSessionsCache"
);
setCacheManager
(
cacheManager
);
}
public
CacheSessionDAO
()
{
super
();
}
@Override
protected
void
doUpdate
(
Session
session
)
{
if
(
session
==
null
||
session
.
getId
()
==
null
)
{
return
;
}
HttpServletRequest
request
=
Servlets
.
getRequest
();
if
(
request
!=
null
){
String
uri
=
request
.
getServletPath
();
// 如果是静态文件,则不更新SESSION
if
(
Servlets
.
isStaticFile
(
uri
)){
return
;
}
// 如果是视图文件,则不更新SESSION
if
(
StringUtils
.
startsWith
(
uri
,
Global
.
getConfig
(
"spring.mvc.view.prefix"
))
&&
StringUtils
.
endsWith
(
uri
,
Global
.
getConfig
(
"spring.mvc.view.suffix"
))){
return
;
}
// 手动控制不更新SESSION
String
updateSession
=
request
.
getParameter
(
"updateSession"
);
if
(
Global
.
FALSE
.
equals
(
updateSession
)
||
Global
.
NO
.
equals
(
updateSession
)){
return
;
}
}
super
.
doUpdate
(
session
);
logger
.
debug
(
"update {} {}"
,
session
.
getId
(),
request
!=
null
?
request
.
getRequestURI
()
:
""
);
}
@Override
protected
void
doDelete
(
Session
session
)
{
if
(
session
==
null
||
session
.
getId
()
==
null
)
{
return
;
}
super
.
doDelete
(
session
);
logger
.
debug
(
"delete {} "
,
session
.
getId
());
}
@Override
protected
Serializable
doCreate
(
Session
session
)
{
HttpServletRequest
request
=
Servlets
.
getRequest
();
if
(
request
!=
null
){
String
uri
=
request
.
getServletPath
();
// 如果是静态文件,则不创建SESSION
if
(
Servlets
.
isStaticFile
(
uri
)){
return
null
;
}
}
super
.
doCreate
(
session
);
logger
.
debug
(
"doCreate {} {}"
,
session
,
request
!=
null
?
request
.
getRequestURI
()
:
""
);
return
session
.
getId
();
}
@Override
protected
Session
doReadSession
(
Serializable
sessionId
)
{
return
super
.
doReadSession
(
sessionId
);
}
@Override
public
Session
readSession
(
Serializable
sessionId
)
throws
UnknownSessionException
{
try
{
Session
s
=
null
;
HttpServletRequest
request
=
Servlets
.
getRequest
();
if
(
request
!=
null
){
String
uri
=
request
.
getServletPath
();
// 如果是静态文件,则不获取SESSION
if
(
Servlets
.
isStaticFile
(
uri
)){
return
null
;
}
s
=
(
Session
)
request
.
getAttribute
(
"session_"
+
sessionId
);
}
if
(
s
!=
null
){
return
s
;
}
Session
session
=
super
.
readSession
(
sessionId
);
logger
.
debug
(
"readSession {} {}"
,
sessionId
,
request
!=
null
?
request
.
getRequestURI
()
:
""
);
if
(
request
!=
null
&&
session
!=
null
){
request
.
setAttribute
(
"session_"
+
sessionId
,
session
);
}
return
session
;
}
catch
(
UnknownSessionException
e
)
{
return
null
;
}
}
/**
* 获取活动会话
* @param includeLeave 是否包括离线(最后访问时间大于3分钟为离线会话)
* @return
*/
@Override
public
Collection
<
Session
>
getActiveSessions
(
boolean
includeLeave
)
{
return
getActiveSessions
(
includeLeave
,
null
,
null
);
}
/**
* 获取活动会话
* @param includeLeave 是否包括离线(最后访问时间大于3分钟为离线会话)
* @param principal 根据登录者对象获取活动会话
* @param filterSession 不为空,则过滤掉(不包含)这个会话。
* @return
*/
@Override
public
Collection
<
Session
>
getActiveSessions
(
boolean
includeLeave
,
Object
principal
,
Session
filterSession
)
{
// 如果包括离线,并无登录者条件。
if
(
includeLeave
&&
principal
==
null
){
return
getActiveSessions
();
}
Set
<
Session
>
sessions
=
Sets
.
newHashSet
();
for
(
Session
session
:
getActiveSessions
()){
boolean
isActiveSession
=
false
;
// 不包括离线并符合最后访问时间小于等于3分钟条件。
if
(
includeLeave
||
DateUtils
.
pastMinutes
(
session
.
getLastAccessTime
())
<=
3
){
isActiveSession
=
true
;
}
// 符合登陆者条件。
if
(
principal
!=
null
){
PrincipalCollection
pc
=
(
PrincipalCollection
)
session
.
getAttribute
(
DefaultSubjectContext
.
PRINCIPALS_SESSION_KEY
);
if
(
principal
.
toString
().
equals
(
pc
!=
null
?
pc
.
getPrimaryPrincipal
().
toString
()
:
StringUtils
.
EMPTY
)){
isActiveSession
=
true
;
}
}
// 过滤掉的SESSION
if
(
filterSession
!=
null
&&
filterSession
.
getId
().
equals
(
session
.
getId
())){
isActiveSession
=
false
;
}
if
(
isActiveSession
){
sessions
.
add
(
session
);
}
}
return
sessions
;
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/shiro/session/SessionDAO.java
0 → 100644
View file @
05beecd0
package
com.jeespring.common.security.shiro.session
;
import
java.util.Collection
;
import
org.apache.shiro.session.Session
;
public
interface
SessionDAO
extends
org
.
apache
.
shiro
.
session
.
mgt
.
eis
.
SessionDAO
{
/**
* 获取活动会话
* @param includeLeave 是否包括离线(最后访问时间大于3分钟为离线会话)
* @return
*/
Collection
<
Session
>
getActiveSessions
(
boolean
includeLeave
);
/**
* 获取活动会话
* @param includeLeave 是否包括离线(最后访问时间大于3分钟为离线会话)
* @param principal 根据登录者对象获取活动会话
* @param filterSession 不为空,则过滤掉(不包含)这个会话。
* @return
*/
Collection
<
Session
>
getActiveSessions
(
boolean
includeLeave
,
Object
principal
,
Session
filterSession
);
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/security/shiro/session/SessionManager.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.security.shiro.session
;
import
java.io.Serializable
;
import
java.util.Collection
;
import
java.util.Date
;
import
javax.servlet.ServletRequest
;
import
javax.servlet.ServletResponse
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
com.jeespring.common.utils.StringUtils
;
import
org.apache.shiro.session.InvalidSessionException
;
import
org.apache.shiro.session.Session
;
import
org.apache.shiro.session.UnknownSessionException
;
import
org.apache.shiro.session.mgt.SessionContext
;
import
org.apache.shiro.session.mgt.SessionKey
;
import
org.apache.shiro.session.mgt.SimpleSession
;
import
org.apache.shiro.web.servlet.Cookie
;
import
org.apache.shiro.web.servlet.ShiroHttpServletRequest
;
import
org.apache.shiro.web.servlet.SimpleCookie
;
import
org.apache.shiro.web.session.mgt.DefaultWebSessionManager
;
import
org.apache.shiro.web.util.WebUtils
;
import
org.springframework.stereotype.Component
;
/**
* 自定义WEB会话管理类
* @author 黄炳桂 516821420@qq.com
* @version 2014-7-20
*/
@Component
public
class
SessionManager
extends
DefaultWebSessionManager
{
public
SessionManager
()
{
super
();
}
@Override
protected
Serializable
getSessionId
(
ServletRequest
request
,
ServletResponse
response
)
{
// 如果参数中包含“__sid”参数,则使用此sid会话。 例如:http://localhost/project?__sid=xxx&__cookie=true
String
sid
=
request
.
getParameter
(
"__sid"
);
if
(
StringUtils
.
isNotBlank
(
sid
))
{
// 是否将sid保存到cookie,浏览器模式下使用此参数。
if
(
WebUtils
.
isTrue
(
request
,
"__cookie"
)){
HttpServletRequest
rq
=
(
HttpServletRequest
)
request
;
HttpServletResponse
rs
=
(
HttpServletResponse
)
response
;
Cookie
template
=
getSessionIdCookie
();
Cookie
cookie
=
new
SimpleCookie
(
template
);
cookie
.
setValue
(
sid
);
cookie
.
saveTo
(
rq
,
rs
);
}
// 设置当前session状态
request
.
setAttribute
(
ShiroHttpServletRequest
.
REFERENCED_SESSION_ID_SOURCE
,
ShiroHttpServletRequest
.
URL_SESSION_ID_SOURCE
);
// session来源与url
request
.
setAttribute
(
ShiroHttpServletRequest
.
REFERENCED_SESSION_ID
,
sid
);
request
.
setAttribute
(
ShiroHttpServletRequest
.
REFERENCED_SESSION_ID_IS_VALID
,
Boolean
.
TRUE
);
return
sid
;
}
else
{
return
super
.
getSessionId
(
request
,
response
);
}
}
@Override
public
void
validateSessions
()
{
super
.
validateSessions
();
}
@Override
protected
Session
retrieveSession
(
SessionKey
sessionKey
)
{
try
{
return
super
.
retrieveSession
(
sessionKey
);
}
catch
(
UnknownSessionException
e
)
{
// 获取不到SESSION不抛出异常
return
null
;
}
}
@Override
public
Date
getStartTimestamp
(
SessionKey
key
)
{
try
{
return
super
.
getStartTimestamp
(
key
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
return
null
;
}
}
@Override
public
Date
getLastAccessTime
(
SessionKey
key
)
{
try
{
return
super
.
getLastAccessTime
(
key
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
return
null
;
}
}
@Override
public
long
getTimeout
(
SessionKey
key
){
try
{
return
super
.
getTimeout
(
key
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
return
0
;
}
}
@Override
public
void
setTimeout
(
SessionKey
key
,
long
maxIdleTimeInMillis
)
{
try
{
super
.
setTimeout
(
key
,
maxIdleTimeInMillis
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
}
}
@Override
public
void
touch
(
SessionKey
key
)
{
try
{
super
.
touch
(
key
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
}
}
@Override
public
String
getHost
(
SessionKey
key
)
{
try
{
return
super
.
getHost
(
key
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
return
null
;
}
}
@Override
public
Collection
<
Object
>
getAttributeKeys
(
SessionKey
key
)
{
try
{
return
super
.
getAttributeKeys
(
key
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
return
null
;
}
}
@Override
public
Object
getAttribute
(
SessionKey
sessionKey
,
Object
attributeKey
)
{
try
{
return
super
.
getAttribute
(
sessionKey
,
attributeKey
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
return
null
;
}
}
@Override
public
void
setAttribute
(
SessionKey
sessionKey
,
Object
attributeKey
,
Object
value
)
{
try
{
super
.
setAttribute
(
sessionKey
,
attributeKey
,
value
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
}
}
@Override
public
Object
removeAttribute
(
SessionKey
sessionKey
,
Object
attributeKey
)
{
try
{
return
super
.
removeAttribute
(
sessionKey
,
attributeKey
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
return
null
;
}
}
@Override
public
void
stop
(
SessionKey
key
)
{
try
{
super
.
stop
(
key
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
}
}
@Override
public
void
checkValid
(
SessionKey
key
)
{
try
{
super
.
checkValid
(
key
);
}
catch
(
InvalidSessionException
e
)
{
// 获取不到SESSION不抛出异常
}
}
@Override
protected
Session
doCreateSession
(
SessionContext
context
)
{
try
{
return
super
.
doCreateSession
(
context
);
}
catch
(
IllegalStateException
e
)
{
return
null
;
}
}
@Override
protected
Session
newSessionInstance
(
SessionContext
context
)
{
Session
session
=
super
.
newSessionInstance
(
context
);
session
.
setTimeout
(
getGlobalSessionTimeout
());
return
session
;
}
@Override
public
Session
start
(
SessionContext
context
)
{
try
{
return
super
.
start
(
context
);
}
catch
(
NullPointerException
e
)
{
SimpleSession
session
=
new
SimpleSession
();
session
.
setId
(
0
);
return
session
;
}
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/service/AbstractBaseService.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.service
;
import
com.jeespring.common.persistence.InterfaceBaseDao
;
import
com.jeespring.common.persistence.AbstractBaseEntity
;
import
com.jeespring.common.persistence.Page
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.List
;
/**
* Service基类
*
* @author 黄炳桂 516821420@qq.com
* @version 2014-05-16
*/
@Transactional
(
readOnly
=
true
)
public
abstract
class
AbstractBaseService
<
Dao
extends
InterfaceBaseDao
<
T
>,
T
extends
AbstractBaseEntity
<
T
>>
extends
AbstractService
{
/**
* 持久层对象
*/
@Autowired
protected
Dao
dao
;
/**
* 获取单条数据
*
* @param id
* @return
*/
public
T
get
(
String
id
)
{
return
dao
.
get
(
id
);
}
/**
* 获取单条数据
*
* @param entity
* @return
*/
public
T
get
(
T
entity
)
{
return
dao
.
get
(
entity
);
}
/**
* 查询统计数据
*
* @param entity
* @return
*/
public
List
<
T
>
total
(
T
entity
)
{
return
dao
.
total
(
entity
);
}
/**
* 查询列表数据
*
* @param entity
* @return
*/
public
List
<
T
>
findList
(
T
entity
)
{
return
dao
.
findList
(
entity
);
}
/**
* 查询所有
*
* @param entity
* @return
*/
public
List
<
T
>
findAllList
(
T
entity
)
{
return
dao
.
findAllList
(
entity
);
}
/**
* 查询分页数据
*
* @param page 分页对象
* @param entity
* @return
*/
public
Page
<
T
>
findPage
(
Page
<
T
>
page
,
T
entity
)
{
entity
.
setPage
(
page
);
page
.
setList
(
dao
.
findList
(
entity
));
return
page
;
}
/**
* 保存数据(插入或更新)
*
* @param entity
*/
@Transactional
(
readOnly
=
false
)
public
void
save
(
T
entity
)
{
int
result
=
0
;
if
(
entity
.
getIsNewRecord
())
{
entity
.
preInsert
();
result
=
dao
.
insert
(
entity
);
}
else
{
entity
.
preUpdate
();
result
=
dao
.
update
(
entity
);
}
}
/**
* 删除数据
*
* @param entity
*/
@Transactional
(
readOnly
=
false
)
public
void
delete
(
T
entity
)
{
dao
.
delete
(
entity
);
}
/**
* 删除数据(逻辑删除,更新del_flag字段为1,在表包含字段del_flag时,可以调用此方法,将数据隐藏)
* @param entity
* @return
*/
@Transactional
(
readOnly
=
false
)
public
void
deleteByLogic
(
T
entity
)
{
dao
.
deleteByLogic
(
entity
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/service/AbstractService.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.service
;
import
java.util.List
;
import
com.jeespring.common.persistence.AbstractEntity
;
import
com.jeespring.common.utils.StringUtils
;
import
com.jeespring.modules.sys.entity.Role
;
import
com.jeespring.modules.sys.entity.User
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.transaction.annotation.Transactional
;
import
com.google.common.collect.Lists
;
/**
* Service基类
* @author 黄炳桂 516821420@qq.com
* @version 2014-05-16
*/
@Transactional
(
readOnly
=
true
)
public
abstract
class
AbstractService
implements
InterfaceService
{
/**
* 日志对象
*/
protected
Logger
logger
=
LoggerFactory
.
getLogger
(
getClass
());
/**
* 数据范围过滤
* @param user 当前用户对象,通过“entity.getCurrentUser()”获取
* @param officeAlias 机构表别名,多个用“,”逗号隔开。
* @param userAlias 用户表别名,多个用“,”逗号隔开,传递空,忽略此参数
* @return 标准连接条件对象
*/
public
static
String
dataScopeFilter
(
User
user
,
String
officeAlias
,
String
userAlias
)
{
StringBuilder
sqlString
=
new
StringBuilder
();
// 进行权限过滤,多个角色权限范围之间为或者关系。
List
<
String
>
dataScope
=
Lists
.
newArrayList
();
// 超级管理员,跳过权限过滤
if
(!
user
.
isAdmin
()){
boolean
isDataScopeAll
=
false
;
for
(
Role
r
:
user
.
getRoleList
()){
for
(
String
oa
:
StringUtils
.
split
(
officeAlias
,
","
)){
if
(!
dataScope
.
contains
(
r
.
getDataScope
())
&&
StringUtils
.
isNotBlank
(
oa
)){
if
(
Role
.
DATA_SCOPE_ALL
.
equals
(
r
.
getDataScope
())){
isDataScopeAll
=
true
;
}
else
if
(
Role
.
DATA_SCOPE_COMPANY_AND_CHILD
.
equals
(
r
.
getDataScope
())){
sqlString
.
append
(
" OR "
+
oa
+
".id = '"
+
user
.
getCompany
().
getId
()
+
"'"
);
sqlString
.
append
(
" OR "
+
oa
+
".parent_ids LIKE '"
+
user
.
getCompany
().
getParentIds
()
+
user
.
getCompany
().
getId
()
+
",%'"
);
}
else
if
(
Role
.
DATA_SCOPE_COMPANY
.
equals
(
r
.
getDataScope
())){
sqlString
.
append
(
" OR "
+
oa
+
".id = '"
+
user
.
getCompany
().
getId
()
+
"'"
);
// 包括本公司下的部门 (type=1:公司;type=2:部门)
sqlString
.
append
(
" OR ("
+
oa
+
".parent_id = '"
+
user
.
getCompany
().
getId
()
+
"' AND "
+
oa
+
".type = '2')"
);
}
else
if
(
Role
.
DATA_SCOPE_OFFICE_AND_CHILD
.
equals
(
r
.
getDataScope
())){
sqlString
.
append
(
" OR "
+
oa
+
".id = '"
+
user
.
getOffice
().
getId
()
+
"'"
);
sqlString
.
append
(
" OR "
+
oa
+
".parent_ids LIKE '"
+
user
.
getOffice
().
getParentIds
()
+
user
.
getOffice
().
getId
()
+
",%'"
);
}
else
if
(
Role
.
DATA_SCOPE_OFFICE
.
equals
(
r
.
getDataScope
())){
sqlString
.
append
(
" OR "
+
oa
+
".id = '"
+
user
.
getOffice
().
getId
()
+
"'"
);
}
else
if
(
Role
.
DATA_SCOPE_CUSTOM
.
equals
(
r
.
getDataScope
())){
sqlString
.
append
(
" OR EXISTS (SELECT 1 FROM sys_role_office WHERE role_id = '"
+
r
.
getId
()
+
"'"
);
sqlString
.
append
(
" AND office_id = "
+
oa
+
".id)"
);
}
//else if (Role.DATA_SCOPE_SELF.equals(r.getDataScope())){
dataScope
.
add
(
r
.
getDataScope
());
}
}
}
// 如果没有全部数据权限,并设置了用户别名,则当前权限为本人;如果未设置别名,当前无权限为已植入权限
if
(!
isDataScopeAll
){
if
(
StringUtils
.
isNotBlank
(
userAlias
)){
for
(
String
ua
:
StringUtils
.
split
(
userAlias
,
","
)){
sqlString
.
append
(
" OR "
+
ua
+
".id = '"
+
user
.
getId
()
+
"'"
);
}
}
else
{
for
(
String
oa
:
StringUtils
.
split
(
officeAlias
,
","
)){
//sqlString.append(" OR " + oa + ".id = " + user.getOffice().getId());
sqlString
.
append
(
" OR "
+
oa
+
".id IS NULL"
);
}
}
}
else
{
// 如果包含全部权限,则去掉之前添加的所有条件,并跳出循环。
sqlString
=
new
StringBuilder
();
}
}
if
(
StringUtils
.
isNotBlank
(
sqlString
.
toString
())){
return
" AND ("
+
sqlString
.
substring
(
4
)
+
")"
;
}
return
""
;
}
/**
* 数据范围过滤(符合业务表字段不同的时候使用,采用exists方法)
* @param entity 当前过滤的实体类
* @param sqlMapKey sqlMap的键值,例如设置“dsf”时,调用方法:${sqlMap.sdf}
* @param officeWheres office表条件,组成:部门表字段=业务表的部门字段
* @param userWheres user表条件,组成:用户表字段=业务表的用户字段
* @example
* dataScopeFilter(user, "dsf", "id=a.office_id", "id=a.create_by");
* dataScopeFilter(entity, "dsf", "code=a.jgdm", "no=a.cjr"); // 适应于业务表关联不同字段时使用,如果关联的不是机构id是code。
*/
public
static
void
dataScopeFilter
(
AbstractEntity
<?>
entity
,
String
sqlMapKey
,
String
officeWheres
,
String
userWheres
)
{
User
user
=
entity
.
getCurrentUser
();
// 如果是超级管理员,则不过滤数据
if
(
user
.
isAdmin
())
{
return
;
}
// 数据范围(1:所有数据;2:所在公司及以下数据;3:所在公司数据;4:所在部门及以下数据;5:所在部门数据;8:仅本人数据;9:按明细设置)
StringBuilder
sqlString
=
new
StringBuilder
();
// 获取到最大的数据权限范围
String
roleId
=
""
;
int
dataScopeInteger
=
8
;
for
(
Role
r
:
user
.
getRoleList
()){
int
ds
=
Integer
.
valueOf
(
r
.
getDataScope
());
if
(
ds
==
9
){
roleId
=
r
.
getId
();
dataScopeInteger
=
ds
;
break
;
}
else
if
(
ds
<
dataScopeInteger
){
roleId
=
r
.
getId
();
dataScopeInteger
=
ds
;
}
}
String
dataScopeString
=
String
.
valueOf
(
dataScopeInteger
);
// 生成部门权限SQL语句
for
(
String
where
:
StringUtils
.
split
(
officeWheres
,
","
)){
if
(
Role
.
DATA_SCOPE_COMPANY_AND_CHILD
.
equals
(
dataScopeString
)){
// 包括本公司下的部门 (type=1:公司;type=2:部门)
sqlString
.
append
(
" AND EXISTS (SELECT 1 FROM SYS_OFFICE"
);
sqlString
.
append
(
" WHERE type='2'"
);
sqlString
.
append
(
" AND (id = '"
+
user
.
getCompany
().
getId
()
+
"'"
);
sqlString
.
append
(
" OR parent_ids LIKE '"
+
user
.
getCompany
().
getParentIds
()
+
user
.
getCompany
().
getId
()
+
",%')"
);
sqlString
.
append
(
" AND "
+
where
+
")"
);
}
else
if
(
Role
.
DATA_SCOPE_COMPANY
.
equals
(
dataScopeString
)){
sqlString
.
append
(
" AND EXISTS (SELECT 1 FROM SYS_OFFICE"
);
sqlString
.
append
(
" WHERE type='2'"
);
sqlString
.
append
(
" AND id = '"
+
user
.
getCompany
().
getId
()
+
"'"
);
sqlString
.
append
(
" AND "
+
where
+
")"
);
}
else
if
(
Role
.
DATA_SCOPE_OFFICE_AND_CHILD
.
equals
(
dataScopeString
)){
sqlString
.
append
(
" AND EXISTS (SELECT 1 FROM SYS_OFFICE"
);
sqlString
.
append
(
" WHERE (id = '"
+
user
.
getOffice
().
getId
()
+
"'"
);
sqlString
.
append
(
" OR parent_ids LIKE '"
+
user
.
getOffice
().
getParentIds
()
+
user
.
getOffice
().
getId
()
+
",%')"
);
sqlString
.
append
(
" AND "
+
where
+
")"
);
}
else
if
(
Role
.
DATA_SCOPE_OFFICE
.
equals
(
dataScopeString
)){
sqlString
.
append
(
" AND EXISTS (SELECT 1 FROM SYS_OFFICE"
);
sqlString
.
append
(
" WHERE id = '"
+
user
.
getOffice
().
getId
()
+
"'"
);
sqlString
.
append
(
" AND "
+
where
+
")"
);
}
else
if
(
Role
.
DATA_SCOPE_CUSTOM
.
equals
(
dataScopeString
)){
sqlString
.
append
(
" AND EXISTS (SELECT 1 FROM sys_role_office ro123456, sys_office o123456"
);
sqlString
.
append
(
" WHERE ro123456.office_id = o123456.id"
);
sqlString
.
append
(
" AND ro123456.role_id = '"
+
roleId
+
"'"
);
sqlString
.
append
(
" AND o123456."
+
where
+
")"
);
}
}
// 生成个人权限SQL语句
for
(
String
where
:
StringUtils
.
split
(
userWheres
,
","
)){
if
(
Role
.
DATA_SCOPE_SELF
.
equals
(
dataScopeString
)){
sqlString
.
append
(
" AND EXISTS (SELECT 1 FROM sys_user"
);
sqlString
.
append
(
" WHERE id='"
+
user
.
getId
()
+
"'"
);
sqlString
.
append
(
" AND "
+
where
+
")"
);
}
}
// 设置到自定义SQL对象
entity
.
getSqlMap
().
put
(
sqlMapKey
,
sqlString
.
toString
());
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/service/ICommonService.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.service
;
import
com.jeespring.common.persistence.Page
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.List
;
/**
* Service基类
*
* @author HuangBingGui
* @version 2014-05-16
*/
public
interface
ICommonService
<
T
>
{
/**
* 获取单条数据
*
* @param id
* @return
*/
T
get
(
String
id
);
/**
* 获取单条数据
*
* @param entity
* @return
*/
T
get
(
T
entity
);
/**
* 查询列表数据
*
* @param entity
* @return
*/
List
<
T
>
findList
(
T
entity
);
/**
* 查询所有
*
* @param entity
* @return
*/
List
<
T
>
findAllList
(
T
entity
);
/**
* 查询分页数据
*
* @param page 分页对象
* @param entity
* @return
*/
Page
<
T
>
findPage
(
Page
<
T
>
page
,
T
entity
)
;
/**
* 保存数据(插入或更新)
*
* @param entity
*/
@Transactional
(
readOnly
=
false
)
void
save
(
T
entity
)
;
/**
* 删除数据
*
* @param entity
*/
@Transactional
(
readOnly
=
false
)
void
delete
(
T
entity
);
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/service/InterfaceService.java
0 → 100644
View file @
05beecd0
package
com.jeespring.common.service
;
import
com.jeespring.modules.sys.entity.User
;
public
interface
InterfaceService
{
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/service/ServiceException.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.service
;
/**
* Service层公用的Exception, 从由Spring管理事务的函数中抛出时会触发事务回滚.
* @author 黄炳桂 516821420@qq.com
*/
public
class
ServiceException
extends
RuntimeException
{
private
static
final
long
serialVersionUID
=
1L
;
public
ServiceException
(
String
message
)
{
super
(
message
);
}
public
ServiceException
(
Throwable
cause
)
{
super
(
cause
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/service/TreeService.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.service
;
import
java.util.List
;
import
org.springframework.transaction.annotation.Transactional
;
import
com.jeespring.common.persistence.TreeDao
;
import
com.jeespring.common.persistence.TreeEntity
;
import
com.jeespring.common.utils.Reflections
;
import
com.jeespring.common.utils.StringUtils
;
/**
* Service基类
* @author 黄炳桂 516821420@qq.com
* @version 2014-05-16
*/
@Transactional
(
readOnly
=
true
)
public
abstract
class
TreeService
<
D
extends
TreeDao
<
T
>,
T
extends
TreeEntity
<
T
>>
extends
AbstractBaseService
<
D
,
T
>
{
@Override
@Transactional
(
readOnly
=
false
)
public
void
save
(
T
entity
)
{
@SuppressWarnings
(
"unchecked"
)
Class
<
T
>
entityClass
=
Reflections
.
getClassGenricType
(
getClass
(),
1
);
// 如果没有设置父节点,则代表为跟节点,有则获取父节点实体
if
(
entity
.
getParent
()
==
null
||
StringUtils
.
isBlank
(
entity
.
getParentId
())
||
"0"
.
equals
(
entity
.
getParentId
())){
entity
.
setParent
(
null
);
}
else
{
entity
.
setParent
(
super
.
get
(
entity
.
getParentId
()));
}
if
(
entity
.
getParent
()
==
null
){
T
parentEntity
=
null
;
try
{
parentEntity
=
entityClass
.
getConstructor
(
String
.
class
).
newInstance
(
"0"
);
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
e
);
}
entity
.
setParent
(
parentEntity
);
entity
.
getParent
().
setParentIds
(
StringUtils
.
EMPTY
);
}
// 获取修改前的parentIds,用于更新子节点的parentIds
String
oldParentIds
=
entity
.
getParentIds
();
// 设置新的父节点串
entity
.
setParentIds
(
entity
.
getParent
().
getParentIds
()+
entity
.
getParent
().
getId
()+
","
);
// 保存或更新实体
super
.
save
(
entity
);
// 更新子节点 parentIds
T
o
=
null
;
try
{
o
=
entityClass
.
newInstance
();
}
catch
(
Exception
e
)
{
throw
new
ServiceException
(
e
);
}
o
.
setParentIds
(
"%,"
+
entity
.
getId
()+
",%"
);
List
<
T
>
list
=
dao
.
findByParentIdsLike
(
o
);
for
(
T
e
:
list
){
if
(
e
.
getParentIds
()
!=
null
&&
oldParentIds
!=
null
){
e
.
setParentIds
(
e
.
getParentIds
().
replace
(
oldParentIds
,
entity
.
getParentIds
()));
preUpdateChild
(
entity
,
e
);
dao
.
updateParentIds
(
e
);
}
}
}
/**
* 预留接口,用户更新子节前调用
* @param childEntity
*/
protected
void
preUpdateChild
(
T
entity
,
T
childEntity
)
{
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/servlet/CKFinderConnectorServlet.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.servlet
;
import
java.io.IOException
;
import
javax.servlet.ServletException
;
import
javax.servlet.annotation.WebInitParam
;
import
javax.servlet.annotation.WebServlet
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
com.ckfinder.connector.ConnectorServlet
;
import
com.jeespring.common.config.Global
;
import
com.jeespring.common.utils.FileUtils
;
import
com.jeespring.modules.sys.security.SystemAuthorizingRealm.Principal
;
import
com.jeespring.modules.sys.utils.UserUtils
;
/**
* CKFinderConnectorServlet
* @author 黄炳桂 516821420@qq.com
* @version 2014-06-25
*/
@WebServlet
(
urlPatterns
=
"/static/ckfinder/core/connector/java/connector.java"
,
initParams
=
{
@WebInitParam
(
name
=
"XMLConfig"
,
value
=
"classpath:ckfinder.xml"
),
@WebInitParam
(
name
=
"debug"
,
value
=
"false"
),
@WebInitParam
(
name
=
"configuration"
,
value
=
"com.jeespring.common.web.CKFinderConfig"
)
},
loadOnStartup
=
1
)
public
class
CKFinderConnectorServlet
extends
ConnectorServlet
{
private
static
final
long
serialVersionUID
=
1L
;
@Override
protected
void
doGet
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
prepareGetResponse
(
request
,
response
,
false
);
super
.
doGet
(
request
,
response
);
}
@Override
protected
void
doPost
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
ServletException
,
IOException
{
prepareGetResponse
(
request
,
response
,
true
);
super
.
doPost
(
request
,
response
);
}
private
void
prepareGetResponse
(
final
HttpServletRequest
request
,
final
HttpServletResponse
response
,
final
boolean
post
)
throws
ServletException
{
Principal
principal
=
UserUtils
.
getPrincipal
();
if
(
principal
==
null
)
{
return
;
}
String
command
=
request
.
getParameter
(
"command"
);
String
type
=
request
.
getParameter
(
"type"
);
// 初始化时,如果startupPath文件夹不存在,则自动创建startupPath文件夹
if
(
"Init"
.
equals
(
command
))
{
String
startupPath
=
request
.
getParameter
(
"startupPath"
);
// 当前文件夹可指定为模块名
if
(
startupPath
!=
null
)
{
String
[]
ss
=
startupPath
.
split
(
":"
);
if
(
ss
.
length
==
2
)
{
String
realPath
=
Global
.
getUserfilesBaseDir
()
+
Global
.
USERFILES_BASE_URL
+
principal
+
"/"
+
ss
[
0
]
+
ss
[
1
];
FileUtils
.
createDirectory
(
FileUtils
.
path
(
realPath
));
}
}
}
// 快捷上传,自动创建当前文件夹,并上传到该路径
else
if
(
"QuickUpload"
.
equals
(
command
)
&&
type
!=
null
)
{
String
currentFolder
=
request
.
getParameter
(
"currentFolder"
);
// 当前文件夹可指定为模块名
String
realPath
=
Global
.
getUserfilesBaseDir
()
+
Global
.
USERFILES_BASE_URL
+
principal
+
"/"
+
type
+
(
currentFolder
!=
null
?
currentFolder
:
""
);
FileUtils
.
createDirectory
(
FileUtils
.
path
(
realPath
));
}
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/servlet/UserfilesDownloadServlet.java
0 → 100644
View file @
05beecd0
package
com.jeespring.common.servlet
;
import
com.jeespring.common.config.Global
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.util.FileCopyUtils
;
import
org.springframework.web.util.UriUtils
;
import
javax.servlet.ServletException
;
import
javax.servlet.annotation.WebServlet
;
import
javax.servlet.http.HttpServlet
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.*
;
/**
* 查看CK上传的图片
*
* @author 黄炳桂 516821420@qq.com
* @version 2014-06-25
*/
@WebServlet
(
urlPatterns
=
"/userfiles/*"
)
public
class
UserfilesDownloadServlet
extends
HttpServlet
{
private
static
final
long
serialVersionUID
=
1L
;
private
Logger
logger
=
LoggerFactory
.
getLogger
(
getClass
());
public
void
fileOutputStream
(
HttpServletRequest
req
,
HttpServletResponse
resp
)
throws
ServletException
,
IOException
{
String
filepath
=
req
.
getRequestURI
();
int
index
=
filepath
.
indexOf
(
Global
.
USERFILES_BASE_URL
);
if
(
index
>=
0
)
{
filepath
=
filepath
.
substring
(
index
+
Global
.
USERFILES_BASE_URL
.
length
());
}
try
{
filepath
=
UriUtils
.
decode
(
filepath
,
"UTF-8"
);
//} catch (UnsupportedEncodingException e1) {
}
catch
(
Exception
e1
)
{
logger
.
error
(
String
.
format
(
"解释文件路径失败,URL地址为%s"
,
filepath
),
e1
);
}
File
file
=
new
File
(
Global
.
getUserfilesBaseDir
()
+
Global
.
USERFILES_BASE_URL
+
filepath
);
try
{
FileCopyUtils
.
copy
(
new
FileInputStream
(
file
),
resp
.
getOutputStream
());
resp
.
setHeader
(
"Content-Type"
,
"application/octet-stream"
);
//resp.setHeader("Cache-Control", "max-age=604800");//设置缓存
return
;
}
catch
(
FileNotFoundException
e
)
{
req
.
setAttribute
(
"exception"
,
new
FileNotFoundException
(
"请求的文件不存在"
));
req
.
getRequestDispatcher
(
"/webapp/WEB-INF/views/error/404.jsp"
).
forward
(
req
,
resp
);
}
}
@Override
protected
void
doGet
(
HttpServletRequest
req
,
HttpServletResponse
resp
)
throws
ServletException
,
IOException
{
fileOutputStream
(
req
,
resp
);
}
@Override
protected
void
doPost
(
HttpServletRequest
req
,
HttpServletResponse
resp
)
throws
ServletException
,
IOException
{
fileOutputStream
(
req
,
resp
);
}
}
Prev
1
2
3
4
5
6
7
8
…
19
Next
Write
Preview
Supports
Markdown
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