Fancy
2024-12-27 c62ec58c827e780c4fb039f03149884c10ba0c52
parse JWT
1个文件已修改
92 ■■■■■ 已修改文件
pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/PmsWechatApplication.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pms-parent/pms-web-wechat/src/main/java/com/dy/pmsWechat/PmsWechatApplication.java
@@ -1,19 +1,109 @@
package com.dy.pmsWechat;
import com.alibaba.fastjson2.JSON;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.pmsWechat.util.JwtUtil;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import java.io.IOException;
import java.io.PrintWriter;
@SpringBootApplication
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"com.dy.common", "com.dy.pmsGlobal", "com.dy.pmsWechat"})
@MapperScan(basePackages={"com.dy.pmsGlobal.dao*"})
public class PmsWechatApplication {
    public static void main(String[] args) {
        SpringApplication.run(PmsWechatApplication.class, args);
    }
    @Configuration
    public static class MyModuleConfig {
        @Bean
        public FilterRegistrationBean<LoginCheckFilter> myCustomFilter() {
            FilterRegistrationBean<LoginCheckFilter> registrationBean = new FilterRegistrationBean<>();
            registrationBean.setFilter(new LoginCheckFilter());
            registrationBean.addUrlPatterns("/myModule/*");
            registrationBean.setOrder(1);
            return registrationBean;
        }
    }
    @Slf4j
    public static class LoginCheckFilter implements Filter {
        @Value("${wechat.jwt.secret-key}")
        private String secretKey;
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            String url = req.getRequestURI().toString();
            // 在这里编写过滤器逻辑
            if (url.contains("login")) {
                chain.doFilter(request, response); // "登录操作,放行" 放行请求,继续执行后续过滤器链或目标资源
                return; // 方法结束,后续逻辑不再执行
            }
            // 获取请求头中的 "token" 值
            String jwt = req.getHeader("token");
            // 如果请求头中没有 "token",返回未登录错误信息
            if (jwt == null || jwt.trim().isEmpty()) { // 使用 Spring 的 StringUtils 检查 jwt 是否为空
                PrintWriter pw = null ;
                try {
                    BaseResponse<?> res = BaseResponseUtils.buildToLogin();
                    String jsonString = JSON.toJSONString(res);
                    response.setCharacterEncoding("UTF-8");
                    response.setContentType("application/json; charset=utf-8");
                    pw = response.getWriter() ;
                    pw.write(jsonString);
                    pw.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    if(pw != null){
                        pw.close();
                    }
                }
                return; // 方法结束,后续逻辑不再执行
            }
            // 解析令牌
            try {
                JwtUtil.parseJWT(secretKey,jwt); // 尝试解析令牌,验证其合法性
            } catch (Exception e) {
                PrintWriter pw = null ;
                try {
                    BaseResponse<?> res = BaseResponseUtils.buildToLogin();
                    String jsonString = JSON.toJSONString(res);
                    response.setCharacterEncoding("UTF-8");
                    response.setContentType("application/json; charset=utf-8");
                    pw = response.getWriter() ;
                    pw.write(jsonString);
                    pw.flush();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }finally {
                    if(pw != null){
                        pw.close();
                    }
                }
                return; // 方法结束,后续逻辑不再执行
            }
            chain.doFilter(request, response);
        }
    }
}