|
|
@@ -0,0 +1,79 @@
|
|
|
+package cn.reghao.dfs.store.inerceptor;
|
|
|
+
|
|
|
+import cn.reghao.jutil.tool.jwt.Jwt;
|
|
|
+import cn.reghao.jutil.tool.jwt.JwtPayload;
|
|
|
+import io.jsonwebtoken.ExpiredJwtException;
|
|
|
+import io.jsonwebtoken.JwtException;
|
|
|
+import org.springframework.core.io.buffer.DataBuffer;
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
+import org.springframework.http.HttpStatus;
|
|
|
+
|
|
|
+import javax.servlet.*;
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.PrintWriter;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.util.List;
|
|
|
+import java.util.function.Consumer;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author reghao
|
|
|
+ * @date 2022-08-25 21:14:23
|
|
|
+ */
|
|
|
+public class JwtTokenFilter implements Filter {
|
|
|
+ @Override
|
|
|
+ public void init(FilterConfig filterConfig) throws ServletException {
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void doFilter(ServletRequest request, ServletResponse response,
|
|
|
+ FilterChain chain) throws IOException, ServletException {
|
|
|
+ HttpServletRequest httpServletRequest = (HttpServletRequest) request;
|
|
|
+ MutableHttpServletRequest mutableHttpServletRequest = new MutableHttpServletRequest(httpServletRequest);
|
|
|
+ String jwtToken = getJwtToken(httpServletRequest);
|
|
|
+ if (jwtToken != null) {
|
|
|
+ try {
|
|
|
+ JwtPayload jwtPayload = Jwt.parse(jwtToken);
|
|
|
+ String userId = jwtPayload.getUserId();
|
|
|
+ mutableHttpServletRequest.putHeader("x-user-id", userId);
|
|
|
+ } catch (JwtException jwtException) {
|
|
|
+ String msg;
|
|
|
+ if (jwtException instanceof ExpiredJwtException) {
|
|
|
+ msg = "登录已过期, 请重新登录";
|
|
|
+ } else {
|
|
|
+ // token 无效
|
|
|
+ msg = "token is invalid";
|
|
|
+ }
|
|
|
+
|
|
|
+ HttpServletResponse httpServletResponse = (HttpServletResponse) response;
|
|
|
+ writeResponse(httpServletResponse, msg);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ mutableHttpServletRequest.putHeader("x-user-id", "-1");
|
|
|
+ }
|
|
|
+
|
|
|
+ chain.doFilter(mutableHttpServletRequest, response);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void writeResponse(HttpServletResponse response, String msg) throws IOException {
|
|
|
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
|
|
+ response.setContentType("text/html; charset=utf-8");
|
|
|
+ PrintWriter printWriter = response.getWriter();
|
|
|
+ printWriter.write(msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getJwtToken(HttpServletRequest request) {
|
|
|
+ String headerValue = request.getHeader(Jwt.AUTH_HEADER);
|
|
|
+ if (headerValue != null && headerValue.startsWith(Jwt.JWT_PREFIX)) {
|
|
|
+ return headerValue.replace(Jwt.JWT_PREFIX, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void destroy() {
|
|
|
+ }
|
|
|
+}
|