springboot中的请求过滤filter与拦截interceptor分析

首先我们要定义一个类,实现标准的过滤器

java 复制代码
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;


@WebFilter("/*")
@Slf4j
public class AuthFilter implements Filter {

    @Override //初始化方法,只会被执行一次
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        log.info("AuthFilter初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("AuthFilter执行了");
        filterChain.doFilter(servletRequest, servletResponse); // 这里就是放行
    }

    @Override //销毁方法,只会被执行一次
    public void destroy() {
        Filter.super.destroy();
        log.info("AuthFilter销毁");
    }
}

由于filter是javaweb里面的类,不是spring里面自带的,所以我们还要在启动类上面加上注解

java 复制代码
@ServletComponentScan // 扫描Servlet,javaweb里面的类
@SpringBootApplication
public class TliasWebManagementApplication {

    public static void main(String[] args) {
        SpringApplication.run(TliasWebManagementApplication.class, args);
    }

}



只拦截登录接口

java 复制代码
@WebFilter("/login")
@Slf4j
public class AuthFilter implements Filter {

    @Override //初始化方法,只会被执行一次
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        log.info("AuthFilter初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("AuthFilter执行了");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override //销毁方法,只会被执行一次
    public void destroy() {
        Filter.super.destroy();
        log.info("AuthFilter销毁");
    }
}



代码实现

xml 复制代码
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.76</version>
 </dependency>
java 复制代码
package com.itheima.filter;
import com.alibaba.fastjson.JSONObject;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebFilter("/*")
@Slf4j
public class AuthFilter implements Filter {

    @Override //初始化方法,只会被执行一次
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        log.info("AuthFilter初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //获取请求的url
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String url = request.getRequestURL().toString();
        log.info("url:{}", url);
        //是否包含login,如果包含,则放行
        if (url.contains("login")) {
            log.info("登录操作,放行");
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        // 获取请求的token
        String token = request.getHeader("token");
        if (!StringUtils.hasLength(token)) {
            response.setStatus(401);
            log.info("token为空,请登录");
            Result error = Result.error("token not login");
            //在过滤器中,手动将结果输出到前端
            String notLogin = JSONObject.toJSONString(error);
            response.getWriter().write(notLogin);
            return;
        }
        // 解析token
        try {
            JwtUtils.parseJWT(token);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("token解析失败");
            Result error = Result.error("not token");
            //在过滤器中,手动将结果输出到前端
            String notLogin = JSONObject.toJSONString(error);
            response.getWriter().write(notLogin);
            return;

        }
        // 放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override //销毁方法,只会被执行一次
    public void destroy() {
        Filter.super.destroy();
        log.info("AuthFilter销毁");
    }
}

测试效果,没有登录,其他请求的返回

相关推荐
骄马之死4 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
郑洁文6 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
螺丝钉code6 小时前
JAVA项目 Claude code CLAUDE.md 到底应该怎么写
java·人工智能·claude code
指令集梦境7 小时前
Cursor + Spring Boot实战:从零写一个RESTful API
spring boot·后端·restful
摇滚侠8 小时前
Maven 入门+高深 单一架构案例 54-59
java·架构·maven·intellij-idea
VidDown8 小时前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman
折哥的程序人生 · 物流技术专研8 小时前
Java 23 种设计模式:从踩坑到精通 | 原型模式 —— 克隆对象,深拷贝与浅拷贝的坑你踩过吗?
java·设计模式·架构·原型模式·单一职责原则
装不满的克莱因瓶8 小时前
基于 OpenResty 扩展开发实现动态服务注册与发现能力
java·开发语言·架构·openresty
程序员小羊!8 小时前
06Java 异常机制与常用类
java
weixin_523185329 小时前
Java基础知识总结(四):引用数据类型与参数传递机制
java·开发语言·python