Commit 23e8d919 authored by zhouxudong's avatar zhouxudong

提交代码

parent 70128765
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();
}
}
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;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment