spring boot 过滤器

在做后台管理系统的时候,登录是再正常不过了。那么,在登录之后,请求一系列的接口是需要使用token的。那么,问题就出来了,在最开始的登录阶段,登录是不需要token。那我们在登录之后,请求每一个接口我们总不能每一次都在方法中去写获取请求头,然后判断token,这是不合理的。

最有效或者最有用的解决方案就是写一个过滤器,让每一个请求的接口都获取请求头,判断......这一切都在过滤器中完成。然而,在过滤器中,我们还需要踢除登录的接口。

java 复制代码
package com.bnc.s99.filter;

import com.bnc.s99.common.RedisClass;
import com.bnc.s99.utils.JwtUtil;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import static org.hibernate.internal.util.collections.ArrayHelper.indexOf;


@Component
public class MyFilter implements Filter {
    @Autowired
    private RedisClass redisClass;

    @Override
    public void init(FilterConfig filterConfig) {

    }
    @Override
    public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException  {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;



        String uri = req.getRequestURI();
        //在uriArr 的数组中存放的就是不需要经过 过滤器的接口
        //也就是说,当请求这数组中的接口时就会自动跳过,不需要经过这过滤器
        String[] uriArr = new String[]{
                "/admin/login",
                "/admin/loginOut",
                "/admin/getCode",
                "/admin/test"
        };
        int index = indexOf(uriArr , uri);
        if (index != -1) {
            chain.doFilter(request, response);
            return;
        }

        String headerToken = req.getHeader("token");
        if(headerToken == null) {
            resp.setStatus(403); // 403 Forbidden
            resp.setContentType("application/json");
            resp.setCharacterEncoding("UTF-8");
            try (PrintWriter out = resp.getWriter()) {
                // 创建一个简单的JSON响应体
                String jsonResponse = "{\"error\": \"没有token\" , \"code\": \"403\" , \"data\": null}";
                out.write(jsonResponse);
            }
            return;
        }

        Boolean bol = JwtUtil.isTokenExpired(headerToken);
        if(bol){
            resp.setStatus(403); // 403 Forbidden
            resp.setContentType("application/json");
            resp.setCharacterEncoding("UTF-8");
            try (PrintWriter out = resp.getWriter()) {
                // 创建一个简单的JSON响应体
                String jsonResponse = "{\"error\": \"token已过期\" , \"code\": \"403\" , \"data\": null}";
                out.write(jsonResponse);
            }
            return;
        }

        Map userinfo = JwtUtil.parseToken(headerToken);
        String username = userinfo.get("username").toString();
        String redisToken = redisClass.getString(username);
        if(Objects.equals(redisToken, headerToken)){
            resp.setStatus(403); // 403 Forbidden
            resp.setContentType("application/json");
            resp.setCharacterEncoding("UTF-8");
            try (PrintWriter out = resp.getWriter()) {
                // 创建一个简单的JSON响应体
                String jsonResponse = "{\"error\": \"token已注销\" , \"code\": \"403\" , \"data\": null}";
                out.write(jsonResponse);
            }
            return;
        }
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {

    }
}
相关推荐
3***C7443 小时前
Spring Boot 整合 log4j2 日志配置教程
spring boot·单元测试·log4j
tg-zm8899963 小时前
2025返利商城源码/挂机自动收益可二开多语言/自定义返利比例/三级分销理财商城
java·mysql·php·laravel·1024程序员节
X***C8623 小时前
SpringBoot:几种常用的接口日期格式化方法
java·spring boot·后端
i***t9193 小时前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
前端达人3 小时前
你的App消息推送为什么石沉大海?看Service Worker源码我终于懂了
java·开发语言
小光学长3 小时前
基于ssm的宠物交易系统的设计与实现850mb48h(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·前端·数据库
编程大师哥3 小时前
vxe-table 透视表分组汇总及排序基础配置
java
8***84824 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
o***74174 小时前
基于SpringBoot的DeepSeek-demo 深度求索-demo 支持流式输出、历史记录
spring boot·后端·lua
9***J6284 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端