Spring boot配置过滤器filter,读取cookie 设置cookie,读取请求头等

本文介绍了SpringBoot中如何使用自定义Filter进行HTTP请求的预处理和响应处理,包括Filter的生命周期方法、设置Cookie和处理跨域问题。通过在`MyFilter`类中实现Filter接口并配置`MyFilterConfig`,展示了Filter的添加和URL匹配。同时,文章强调了在主程序入口添加`@ServletComponentScan`注解以使Filter生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先 我们理解一下filter这个狗东西在项目中的作用

 上图是filter在服务中的作用

spring boot 中添加filter分为两种 一种为自定义版 一种为注解版

这里我们先用自定义版,目录结构如下吊样

 首先我们定义一个MyFilter类 并实现Filter接口,这里就是http入口和出口,所以我们可以在这里做一些业务上的操作

package com.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Arrays;

/**
 * @Auther: Xu
 * @Date: 2021/7/9 - 07 - 09 - 14:19
 * @Description: com.filter
 * @version: 1.0
 */
@Slf4j
@Component
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("初始化过滤器{}",filterConfig.getFilterName());
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("过滤器开始对请求进行预处理");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //获取请求地址
        String requestUrl = request.getRequestURI();
        System.out.println("请求地址为:"+requestUrl);


        Cookie[] cookies = request.getCookies();
        log.info("获取到的cookie为{}", cookies);
        if(cookies == null){
            //创建cookie
            Cookie cookie = new Cookie("youcookie", URLEncoder.encode("aaabbb","utf-8"));

            cookie.setMaxAge(60 * 60 * 24);//设置有效期
            cookie.setSecure(true);  //Https 安全cookie
            cookie.setHttpOnly(true);//只读
            //设置cookie.setPath(“/”);
            cookie.setPath("/");
            response.addCookie(cookie);
        }else{
            System.out.println("cookies"+cookies.toString());
        }
        //用来处理跨域
//        response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");//这里不能写*,*代表接受所有域名访问,如写*则下面一行代码无效。谨记
//        response.setHeader("Access-Control-Allow-Credentials", "true");//true代表允许携带cookie
//        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
//        response.setHeader("Access-Control-Max-Age", "3600");
//        response.setHeader("Access-Control-Allow-Headers", "content-type,Authorization");

        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("已成功返回结果"+requestUrl);
    }

    @Override
    public void destroy() {
        log.info("过滤器已销毁");
    }
}

接下来我们定义MyFileConfig类

package com.config;

import com.filter.MyFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * @Auther: Xu
 * @Date: 2021/7/9 - 07 - 09 - 14:17
 * @Description: com.config
 * @version: 1.0
 */
@Configuration
public class MyFilterConfig {
    @Autowired
    private MyFilter myFilter;
    @Bean
    public FilterRegistrationBean thirdFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();

        filterRegistrationBean.setFilter(myFilter);
        filterRegistrationBean.addUrlPatterns("/*");
//        filterRegistrationBean.setUrlPatterns(new ArrayList<>(Arrays.asList("/api/*")));

        return filterRegistrationBean;
    }
}

@Configuration这个注解 之前跟大家讲过,当我们项目启动的时候会自动加载带有这个注解的类

注意:

        在我们主程序入口 appLication这个类上面要加上

@ServletComponentScan

        这个注解,filter才会生效。

OK 重新启动项目就可以了

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值