Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
P
postcard-service
Project
Project
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhouxudong
postcard-service
Commits
23e8d919
Commit
23e8d919
authored
Dec 14, 2023
by
zhouxudong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
提交代码
parent
70128765
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
150 additions
and
0 deletions
+150
-0
WxLoginFilter.java
...ava/com/postcard/service/config/filter/WxLoginFilter.java
+99
-0
WeixinRequestUtils.java
...om/postcard/service/config/weixin/WeixinRequestUtils.java
+51
-0
No files found.
src/main/java/com/postcard/service/config/filter/WxLoginFilter.java
0 → 100644
View file @
23e8d919
package
com
.
postcard
.
service
.
config
.
filter
;
import
cn.hutool.json.JSONUtil
;
import
com.postcard.service.config.weixin.WeixinRequestUtils
;
import
com.postcard.service.domain.AjaxResult
;
import
com.postcard.service.domain.JwtInfo
;
import
com.postcard.service.moudle.user.entity.UserAppletEntity
;
import
com.postcard.service.moudle.user.service.UserService
;
import
com.postcard.service.util.jwt.JwtTokenUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
javax.servlet.*
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.util.Map
;
/**
* @Author:zhouxudong
*
* @version: 1.0 @Date: 2023/12/14 18:35 @Description: 微信登录授权过滤器
*/
@Component
@Slf4j
public
class
WxLoginFilter
implements
Filter
{
@Autowired
private
WeixinRequestUtils
weixinRequestUtils
;
@Autowired
private
UserService
userService
;
@Override
public
void
doFilter
(
ServletRequest
servletRequest
,
ServletResponse
servletResponse
,
FilterChain
filterChain
)
throws
IOException
,
ServletException
{
HttpServletRequest
request
=
(
HttpServletRequest
)
servletRequest
;
HttpServletResponse
response
=
(
HttpServletResponse
)
servletResponse
;
String
requestURI
=
request
.
getRequestURI
();
if
(!
requestURI
.
contains
(
"/user/login"
))
{
filterChain
.
doFilter
(
request
,
response
);
return
;
}
// 获取小程序传递的code码
String
code
=
request
.
getParameter
(
"code"
);
if
(
StringUtils
.
isBlank
(
code
))
{
this
.
loginFailHandler
(
response
,
"code不能为空"
);
}
Map
userIdetify
=
this
.
weixinRequestUtils
.
getUserIdetify
(
code
);
log
.
info
(
"微信登录授权结果:{}"
,
userIdetify
);
if
(
ObjectUtils
.
isNotEmpty
(
userIdetify
))
{
String
openid
=
String
.
valueOf
(
userIdetify
.
get
(
"openid"
));
if
(
StringUtils
.
isNotBlank
(
openid
))
{
JwtInfo
jwtInfo
=
new
JwtInfo
();
jwtInfo
.
setOpenId
(
openid
);
jwtInfo
.
setSessionKey
(
ObjectUtils
.
isEmpty
(
userIdetify
.
get
(
"session_key"
))
?
null
:
userIdetify
.
get
(
"session_key"
).
toString
());
UserAppletEntity
userApplet
=
userService
.
getUserInfo
(
openid
);
jwtInfo
.
setUserId
(
userApplet
.
getId
());
jwtInfo
.
setNickName
(
userApplet
.
getNickName
());
jwtInfo
.
setPhone
(
userApplet
.
getPhone
());
log
.
info
(
"jwt信息:{}"
,
jwtInfo
);
String
token
;
try
{
token
=
JwtTokenUtil
.
createToken
(
jwtInfo
,
null
);
log
.
info
(
"创建token:{}"
,
token
);
this
.
loginSuccessHandler
(
response
,
token
);
return
;
}
catch
(
Exception
e
)
{
this
.
loginFailHandler
(
response
,
"获取用户openid失败"
);
}
}
}
this
.
loginFailHandler
(
response
,
"获取用户openid失败"
);
}
private
void
loginSuccessHandler
(
HttpServletResponse
response
,
Object
data
)
throws
IOException
{
response
.
setStatus
(
HttpServletResponse
.
SC_OK
);
AjaxResult
result
=
new
AjaxResult
(
HttpServletResponse
.
SC_OK
,
null
,
data
);
this
.
printWriter
(
response
,
result
);
}
private
void
loginFailHandler
(
HttpServletResponse
response
,
String
exception
)
throws
IOException
{
response
.
setStatus
(
HttpServletResponse
.
SC_UNAUTHORIZED
);
AjaxResult
result
=
new
AjaxResult
(
HttpServletResponse
.
SC_UNAUTHORIZED
,
exception
,
null
);
this
.
printWriter
(
response
,
result
);
}
private
void
printWriter
(
HttpServletResponse
response
,
AjaxResult
ajaxResult
)
throws
IOException
{
response
.
setContentType
(
"application/json;charset=utf-8"
);
PrintWriter
out
=
response
.
getWriter
();
out
.
write
(
JSONUtil
.
toJsonStr
(
ajaxResult
));
out
.
flush
();
out
.
close
();
}
}
src/main/java/com/postcard/service/config/weixin/WeixinRequestUtils.java
0 → 100644
View file @
23e8d919
package
com
.
postcard
.
service
.
config
.
weixin
;
import
cn.hutool.json.JSONUtil
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.http.MediaType
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.reactive.function.client.WebClient
;
import
reactor.core.publisher.Mono
;
import
java.time.Duration
;
import
java.util.Map
;
@Component
@Slf4j
public
class
WeixinRequestUtils
{
@Value
(
"${spring.wxconfig.code2Session-url}"
)
private
String
code2SessionUrl
;
@Autowired
private
WebClient
webClient
;
/**
* 根据code从微信处获取用户唯一标识
*
* @param code
* @return {@link Map}
* @since 2021/9/18 8:25
*/
public
Map
getUserIdetify
(
String
code
)
{
Map
result
=
this
.
webClient
.
get
()
.
uri
(
this
.
code2SessionUrl
+
code
)
.
header
(
HttpHeaders
.
CONTENT_TYPE
,
MediaType
.
APPLICATION_JSON_VALUE
)
.
retrieve
()
.
bodyToMono
(
String
.
class
)
.
timeout
(
Duration
.
ofSeconds
(
4
))
.
onErrorResume
(
e
->
{
log
.
error
(
"调用微信 auth.code2Session 接口换取用户唯一标识失败。"
,
e
);
return
Mono
.
empty
();
})
.
map
(
str
->
JSONUtil
.
toBean
(
str
,
Map
.
class
))
.
block
();
return
result
;
}
}
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