赞
踩
过滤器依赖于servlet容器,可以过滤用户请求,但不能改变用户参数,因为ServletRequest只提供了getParameter方法没有setParameter方法,除非自己重新一个ServletRequest,自己实现一个setParameter方法,后续文章中再来尝试这个。今天主要给大家介绍SpringBoot中创建过滤器的两种方式
package com.dhr.study.filter.beansss; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.servlet.*; import java.io.IOException; @Slf4j @Component public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("非注解init"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("非注解before"); filterChain.doFilter(servletRequest, servletResponse); log.info("非注解after"); } @Override public void destroy() { log.info("非注解destroy"); } }
package com.dhr.study.filter.beansss; import lombok.extern.slf4j.Slf4j; import javax.servlet.*; import java.io.IOException; @Slf4j public class MyFilter2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("非注解init2"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("非注解before2"); filterChain.doFilter(servletRequest, servletResponse); log.info("非注解after2"); } @Override public void destroy() { log.info("非注解destroy2"); } }
package com.dhr.study.filter.beansss; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; @Configuration public class MyFilterConfig { @Autowired private MyFilter myFilter; @Bean public FilterRegistrationBean oneFilter(){ // MyFilterTwo myFilterTwo = new MyFilterTwo(); FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); //过滤器名称 filterRegistrationBean.setName("myFilter"); //注入过滤器 filterRegistrationBean.setFilter(myFilter); List<String> urls = new ArrayList<>(); urls.add("/test"); filterRegistrationBean.setUrlPatterns(urls); //过滤器顺序 filterRegistrationBean.setOrder(3); return filterRegistrationBean; } @Bean public FilterRegistrationBean twoFilter(){ // MyFilterTwo myFilterTwo = new MyFilterTwo(); FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); //过滤器名称 filterRegistrationBean.setName("myFilter2"); //注入过滤器 filterRegistrationBean.setFilter(new MyFilter2()); List<String> urls = new ArrayList<>(); urls.add("/test"); filterRegistrationBean.setUrlPatterns(urls); //过滤器顺序 filterRegistrationBean.setOrder(4); return filterRegistrationBean; } }
package com.dhr.study.filter.annotation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.core.annotation.Order; import org.springframework.util.CollectionUtils; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @WebFilter(filterName = "AnnotationFilter1", urlPatterns = {"/*"}, initParams = {@WebInitParam(name = "noFilterUrl", value = "/test")}) @Order(1) @Slf4j public class AnnotationFilter1 implements Filter { private List<String> noFilterUrls; @Override public void init(FilterConfig filterConfig) { log.info("#### AnnotationFilter1 ==== init ####"); // 从过滤器配置中获取initParams参数 String noFilterUrl = filterConfig.getInitParameter("noFilterUrl"); // 将排除的URL放入成员变量noFilterUrls中 if (StringUtils.isNotBlank(noFilterUrl)) { noFilterUrls = new ArrayList<>(Arrays.asList(noFilterUrl.split(","))); } } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("#### AnnotationFilter1 ==== doFilter before ####"); // 过滤器配置的 urlPatterns 为 /* 表示过滤所有的请求 // 有请求进来时,会先进入到过滤器中,此时则获取请求的uri地址 String url = ((HttpServletRequest) servletRequest).getRequestURI(); Boolean flag = false; if (!CollectionUtils.isEmpty(noFilterUrls)) { for (String noFilterUrl : noFilterUrls) { // 如果请求的地址中包含有 initParams 传递的参数值,则不继续向下执行 if (url.contains(noFilterUrl)) { flag = true; break; } } } if (!flag) { //过滤请求响应逻辑 log.info("过滤请求响应逻辑"); }else { filterChain.doFilter(servletRequest, servletResponse); } log.info("#### AnnotationFilter1 ==== doFilter after ####"); } @Override public void destroy() { log.info("#### AnnotationFilter1 ==== destroy ####"); } }
package com.dhr.study.filter.annotation; import lombok.extern.slf4j.Slf4j; import org.springframework.core.annotation.Order; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(filterName = "AnnotationFilter2",urlPatterns = {"/*"}) @Order(2) @Slf4j public class AnnotationFilter2 implements Filter { @Override public void init(FilterConfig filterConfig) { log.info("#### AnnotationFilter2 ==== init ####"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("#### AnnotationFilter2 ==== doFilter before ####"); String msg = servletRequest.getParameter("msg"); if("err".equalsIgnoreCase(msg)){ throw new RuntimeException("传递参数有误,验证过滤器...."); } filterChain.doFilter(servletRequest,servletResponse); log.info("#### AnnotationFilter2 ==== doFilter after ####"); } @Override public void destroy() { log.info("#### AnnotationFilter2 ==== destroy ####"); } }
@ServletComponentScan
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。