spring boot 自定义过滤器链

spring boot 会按照order值的大小,从大到小的顺序来依次过滤。

贴下代码:

package com.osp.ucenter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.web.filter.DelegatingFilterProxy;

import com.osp.ucenter.filter.CrossDomainFilter;
import com.osp.ucenter.filter.Initfilter;
import com.osp.ucenter.filter.SecurityFilter;

@EnableAutoConfiguration
@SpringBootApplication
public class UcenterMain {

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

	/**
	 * 跨域处理Filter(最先执行此过滤器,避免跨域请求调用两次而执行后续的过滤器链)
	 *
	 * @return
	 */
	@Bean
    @Order(Integer.MAX_VALUE)
	public FilterRegistrationBean crossDomainFilterRegistration() {
		FilterRegistrationBean registration = new FilterRegistrationBean();
		registration.setFilter(new CrossDomainFilter());
		registration.addUrlPatterns("/*");
		registration.setName("CrossDomainFilter");
		return registration;
	}

	/**
	 * 初始化
	 *
	 * @return
	 */
	@Bean
	@Order(Integer.MAX_VALUE-1)
	public FilterRegistrationBean InitfilterRegistration() {
		FilterRegistrationBean registration = new FilterRegistrationBean();
		registration.setFilter(new Initfilter());
		registration.addUrlPatterns("/no");
		registration.setName("Initfilter");
		return registration;
	}

	/**
	 * 安全权限 DelegatingFilterProxy servlet容器与IOC容器关联
	 *
	 * @return
	 */
	@Bean
	@Order(Integer.MAX_VALUE-2)
	public FilterRegistrationBean securityFilter() {
		FilterRegistrationBean registration = new FilterRegistrationBean();
		registration.setFilter(new DelegatingFilterProxy("SecurityFilter"));
		registration.addInitParameter("targetFilterLifecycle", "true");
		registration.addUrlPatterns("/*");
		return registration;
	}

	@Bean(name = "SecurityFilter")
	public SecurityFilter getSecurityFilter(){
		return new SecurityFilter();
	}

}

  随便贴一个过滤器

package com.osp.ucenter.filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.filter.OncePerRequestFilter;

/**
 * 处理跨域的filter
 *
 */
public class CrossDomainFilter extends OncePerRequestFilter {

	Logger logger = Logger.getLogger(CrossDomainFilter.class);

	@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
		try {
			// 跨域
			String origin = request.getHeader("Origin");
			if (origin == null) {
				response.addHeader("Access-Control-Allow-Origin", "*");
			} else {
				response.addHeader("Access-Control-Allow-Origin", origin);
			}
			response.addHeader("Access-Control-Allow-Headers",
					"Origin, x-requested-with, Content-Type, Accept,X-Cookie, token");
			response.addHeader("Access-Control-Allow-Credentials", "true");
			response.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE");
			if (request.getMethod().equals("OPTIONS")) {
				response.setStatus(HttpServletResponse.SC_OK);
				return;
			}
			filterChain.doFilter(request, response);
		} catch (Exception e) {
			logger.error("Exception in crossDomainFilter.doFilter", e);
			throw e;
		}
	}

	@Override
	public void destroy() {
	}

}

  

时间: 2024-10-24 12:04:32

spring boot 自定义过滤器链的相关文章

Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 package springboot01cache.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; im

Spring Boot自定义错误页面,Whitelabel Error Page处理方式

我已经是Spring Framework框架的忠实粉丝.对于企业软件开发者来说它提供了对常见问题的通用解决方案,包括那些你在未来开发中没有意识到的问题.但是,它构建的J2EE项目变得比较臃肿,需要被一种新的解决方案替代. 我最大的抱怨就是最开始使用spring Framework构建项目十分缓慢和复杂,比如构建一个包含JPA的MVC应用.为改变这种情况,Spring Boot应运而生了. Spring Boot以一种新的微服务的方式来替代以Spring Framework构建项目的传统方式,我已

【第四十章】Spring Boot 自定义拦截器

1.首先编写拦截器代码 package com.sarnath.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.web.servlet.HandlerInterceptor; import

Spring boot 自定义starter

以下配置来自尚硅谷.. 常用如何配置 @Configuration //指定这个类是一个配置类 @ConditionalOnXXX //在指定条件成立的情况下自动配置类生效 @AutoConfigureAfter //指定自动配置类的顺序 @Bean //给容器中添加组件 @ConfigurationPropertie结合相关xxxProperties类来绑定相关的配置 @EnableConfigurationProperties //让xxxProperties生效加入到容器中 自动配置类要能

spring boot 自定义Validator注解

spring boot在Post接受一个对象参数的时候可以使用@Valid去验证,如下代码 在创建一个User类 上面的@NotBlank和@Past就做了一个判断,如何做类似的注解用来验证数据 创建一个MyConstraint的接口 @Retention :用来说明该注解类的生命周期.它有以下三个参数:RetentionPolicy.SOURCE : 注解只保留在源文件中RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃RetentionPo

Spring Boot自定义配置实现IDE自动提示

一.背景 官方提供的spring boot starter的配置项,我们用IDE配置的时候一般都有自动提示的,如下图所示 而我们自己自定义的配置却没有,对开发非常不友好容易打错配置,那这个是怎样实现的呢? ? 二.提示原理 IDE是通过读取配置信息的元数据而实现自动提示的,而元数据在目录META-INF中的spring-configuration-metadata.json 或者 additional-spring-configuration-metadata.json ? 三.实现自动提示 以

spring boot自定义starter

使用spring boot开发微服务后,工程的数量大大增加(一定要按照领域来切,不要一个中间件客户端包一个),让各个jar从开发和运行时自包含成了一个重要的内容之一.spring boot starter就可以用来解决该问题(没事启动时别依赖于applicationContext.getBean获取bean进行处理,依赖关系太折腾,有时候在复杂系统中解决此事比较麻烦,需要修改开源框架代码才能实现,反过来修改开源源码后,维护也是个麻烦事).言归正传,说说自定义starter.首先请熟悉spring

spring security +spring boot 自定义 403 页面

用的spring security  做的权限控制, 当  访问没有权限, 跳转 会跳到默认403 页面.不符合当前项目需求. 一下是解决方式: package com.ycmedia; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.au

企业分布式微服务云SpringCloud SpringBoot mybatis (十九)Spring Boot 自定义配置文件

上面介绍的是我们都把配置文件写到application.yml中.有时我们不愿意把配置都写到application配置文件中,这时需要我们自定义配置文件,比如test.properties: com.forezp.name=forezp com.forezp.age=12 怎么将这个配置文件信息赋予给一个javabean呢? @Configuration @PropertySource(value = "classpath:test.properties") @Configuratio