首先 我们理解一下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 重新启动项目就可以了