1. 程式人生 > >如何在SpringBoot的 過濾器之中注入Bean物件

如何在SpringBoot的 過濾器之中注入Bean物件

我建立一個全域性攔截器,此攔截器主要用於攔截APP使用者登入和請求API時候,必須加密,我把它命名為SecurityFilter,它繼承了Filter,web應用啟動的順序是:listener->filter->servlet

而因為專案應用了SpringBoot,所以我們專案啟動時,先初始化listener,因此註解的bean會被初始化和注入;然後再來就filter的初始化,再接著才到我們的dispathServlet的初始化,因此,當我們需要在filter裡注入一個註解的bean時,就會注入失敗,因為filter初始化時,註解的bean還沒初始化,沒法注入。

那麼,解決方法如下:

@Bean
public FilterRegistrationBean securityFilterRegistration() {
    	FilterRegistrationBean registration = new FilterRegistrationBean();		
	DelegatingFilterProxy httpBasicFilter = new DelegatingFilterProxy();
	registration.setFilter(httpBasicFilter);
	Map<String,String> m = new HashMap<String,String>();
	m.put("targetBeanName","securityFilter");
	m.put("targetFilterLifecycle","true");
	registration.setInitParameters(m);		   
	registration.addUrlPatterns("/appapi/*");

	registration.setOrder(2);
	return registration;
}
這樣你就可以在securityFilter 裡面新增@Autowired下的bean了。
@Autowired
private PermissionUserService userService;

以上事項方式會全域性過濾,此過濾不起作用適合於全域性過濾(/*);

registration.addUrlPatterns("/appapi/*");

建議使用如下方式

@Bean
public FilterRegistrationBean securityFilterRegistration() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(securityFilterBean());
        registrationBean.addUrlPatterns("/appapi/*");
        registrationBean.setName("securityFilter");
        registrationBean.setOrder(2);
        return registrationBean;
    }
	
@Bean
public Filter securityFilterBean() {
 return new SecurityFilter();
}

參考文章:

https://blog.csdn.net/xiaoyi52/article/details/76686001

https://blog.csdn.net/cutterwolf/article/details/77849158

https://blog.csdn.net/u013076044/article/details/72903130

https://blog.csdn.net/angel708884645/article/details/51148865

如何在servlet取得spring beans (autowired)

https://blog.csdn.net/axzywan/article/details/8056892

相關推薦

如何在SpringBoot過濾器之中注入Bean物件

我建立一個全域性攔截器,此攔截器主要用於攔截APP使用者登入和請求API時候,必須加密,我把它命名為SecurityFilter,它繼承了Filter,web應用啟動的順序是:listener->filter->servlet,而因為專案應用了SpringBoot

Spring詳解:WebServlet 中不能注入Bean物件

1. 前言 最近在研究Spring IOC、AOP以及和Mybatis整合的時候發現在Spring中使用Servlet+Service+Dao(Mybatis)的時候,發現在Controller層也就是Servlet中不能通過@Autowired注入Bean物件。這個時候我就納悶了,在S

如何在過濾器中獲取請求的引數及過濾器如何注入bean

1:過濾器中使用bean:因為過濾器是Tomcat容器不受spring的管理所以不能用註解直接注入。我們可以通過下面方式注入:WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext()

問題:使用@Autowired無法注入Bean物件

問題 在公司的一個專案開發時,遇到了一個類的屬性無法注入的問題 public class DemoController extends BaseController implements BussinessProcessHandler { @Autow

Springboot中如何在Utils類中使用@Autowired注入bean

Springboot中如果希望在Utils工具類中,使用到我們已經定義過的Dao層或者Service層Bean,可以如下編寫Utils類: 1. 使用@Component註解標記工具類StatisticsUtils: 2. 使用@Autowired(@Autowired和@Resource的區別不再介紹)

filter過濾器注入bean例項時注入失敗null

1、問題描述 SpringBoot中filter注入bean時注入失敗,bean一直為空。 @Slf4j @Component public class RestAuthFilter extends FormAuthenticationFilter { /

springboot中使用filter時注入bean為null的解決辦法

過濾器是servlet規範中定義的,並不歸spring容器管理,也無法直接注入spring中的bean(會報錯) 初始化時通過spring上下文獲取,進行bean的初始化: @Override public void init(FilterConfig filterConfig) throws Serv

springboot整合filter之在filter中如何獲取spring容器中的bean物件

本人在專案使用的是springboot,具業務需要本人使用了filter過濾器,進行一個路徑攔截,本人配置的是攔截所有/*,然後對路徑中包含的特有欄位進行處理。 filter中需要使用service的bean物件,我使用@Autowired註解注入物件,然後啟動,訪問時報空

解決springboot多模組注入(@Bean、@Service、@Component)訪問不到的問題

如果你因為Service注入失敗,看過無數文章,甚至看過N份原始碼仍不得要領,希望我能終結你的問題; SpringBoot中Service自動注入很方便,例: Service.class(介面類) ServiceImpl.class(實現類) Controller

Spring boot 梳理 - SpringBoot注入ApplicationContext物件的三種方式

直接注入(Autowired) @Configuration public class OAConfig { @Autowired private ApplicationContext applicationContext; @B

springboot 攔截器intecpter中不能注入bean的解決方案

顯而易見,攔截器的執行是在bean的初始化之前,所以如果在程式碼中直接寫上如下圖所示   因為UserService初始化在攔截器之後. 所以要在攔截器中直接注入 現在探索出兩種方式 第一種 在攔截器配置檔案中注入UserService 把userService作為引數傳遞

springboot注入bean

背景:jar包中的類和專案的類包路徑不在一個父類上,專案掃面時不能掃描到,需要注入容器。 1、寫一個類如:beanConfig,在類上加註解@Configuration 2、在類上寫一個public的方法,返回型別就是你要注入的類,在方法上加@Bean,new一個需要的類返

springboot中@webfilter註解的filter時注入bean都是null

在使用@Webfilter註解Filter的情況下,不上外部tomcat時是沒有問題的。但是在tomcat下執行時,filter中注入的bean就都是null 解決辦法: 一:去掉@Webfilter註解 public class GeneralFilter implements Filter {

springboot 在@Autowire無法注入bean時的臨時處理辦法

問題由來: 在用netty寫一個網路程式設計專案的時候,需要用到mongoTemplate這個springdata提供的mongodb的操作類。但是這個只能由springboot來注入,但是netty又會進行new操作,使得@Autowire無法正常工作。

解決SpringBoot使用Quartz無法注入Bean的問題

依賴 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId>

springboot @value注入static物件 與 application.properties 與 pom.xml 取值

1.在pom.xml檔案裡的properties定義一個引數 2.定義完了,在application.properties中獲取這個值 server.port=8090 #@pom.xml中的一

在Servlet中可訪問Spring bean物件,但是不能直接以注入的方式引用

在Servlet中使用註解的方式引用Spring bean物件,會報空指標,因此可以在init()方法中通過WebApplicationContextUtils.getWebApplicationContext(serv

spring的注入引數(bean物件中又有bean屬性),beans.xml配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.o

SpringBoot注入ApplicationContext物件的三種方式

在專案中,我們可能需要手動獲取spring中的bean物件,這時就需要通過 ApplicationContext 去操作一波了! 1、直接注入(Autowired) @Component public class User { @Aut

java學習——springboot動態獲得javaBean,手動注入Bean

一般來說,我們使用springboot都會用@AutoWired自動注入Bean物件,但是有些情況下,@AutoWired無法滿足我們,比如執行緒中,或者動態例項化多個類中的一個物件時。在前段時間做專案時,就遇到這個問題,有多個mybatis的mapper介面,我們需要根