在Shiro的過濾器中新增Spring容器管理的Bean
在web.xml中進行配置,對所有的URL請求進行過濾,就像"擊鼓傳花"一樣,鏈式處理。
配置分為兩種A和B。
A:普通配置
<filter>
<filter-name>permissionFilter</filter-name>
<filter-class>com.taobao.riskm.filter.PermissionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>permissionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
由filter和filter-mapping構成。filter指定過濾器處理類(實現了Filter介面),filter-mapping指定過濾的規則。
B:高階配置
<filter>
<filter-name>permission</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>permission</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>
在spring bean配置中加入:
<bean id="permission" class="com.taobao.kfc.kwb.web.permission.PermissionHttpServlet"></bean>
因為filter比bean先載入,也就是spring會先載入filter指定的類到container中,這樣filter中注入的spring bean就為null了。
解決辦法:
先filter中加入DelegatingFilterProxy類,"targetFilterLifecycle"指明作用於filter的所有生命週期。
原理是,DelegatingFilterProxy類是一個代理類,所有的請求都會首先發到這個filter代理,然後再按照"filter-name"委派到spring中的這個bean。
在Spring中配置的bean的name要和web.xml中的<filter-name>一樣.
------------------------------------------------------------------------------------------------------
在Shiro的配置檔案中,發現與上述有所差異,Spring中配置的bean的name如下
在web.xml中
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/actions/*</url-pattern>
</filter-mapping>
<!-- Shiro Filter 攔截器相關配置 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- securityManager -->
<property name="securityManager" ref="securityManager"/>
<!-- 重新登入路徑 -->
<property name="loginUrl" value="/actions/invalid"/>
<!-- 使用者訪問無許可權的連結時跳轉此頁面 -->
<property name="unauthorizedUrl" value="/actions/index"/>
<!-- 驗證成功跳轉此頁面 -->
<property name="successUrl" value="/actions/secured/home"/>
<!-- 過濾鏈定義 -->
<property name="filterChainDefinitions">
<value><!-- 注意攔截順序,從上往下依次設定-->
/actions/locale* = anon
/actions/index* = anon
/actions/logout = logout
/actions/security/authenticate* = anon
/actions/secured/** = authc,userAccessControlFilter
/actions/**=authc
</value>
</property>
<property name="filters">
<map>
<entry key="userAccessControlFilter" value-ref="userAccessControlFilter"/>
<entry key="logout" value-ref="logoutFilter"/>
</map>
</property>
</bean>
<!-- Shiro 生命週期處理器,,保證實現shiro內部的生命週期函式bean的執行 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
相關推薦
在Shiro的過濾器中新增Spring容器管理的Bean
在web.xml中進行配置,對所有的URL請求進行過濾,就像"擊鼓傳花"一樣,鏈式處理。配置分為兩種A和B。A:普通配置在web.xml中增加如下內容:<filter> <filter-name>permissionFilter</filt
java 如何在listener(監聽器) 中使用Spring容器管理bean
問題來源:在Listener監聽器中無法使用Spring容器的@Resource或者@Autowired 註解的方法注入bean,因為,在web Server容器中,無論是Servlet,Filter,還是Listener都不是Spring容器管理的,因此我們都無法在這些
普通類中引用spring 容器管理的bean
今天遇到一個問題,在webservice介面中去注入spring管理的類的時候出現了空指標的問題,但是呢,這個webservice類並沒有交給spring去做統一管理,那麼要怎麼注入到spring的b
filter中使用Spring容器注入bean
[1] XML配置形式 Tomcat容器初始化順序:監聽器–>過濾器–>servlet,因此springMVCservlet初始化之前,過濾器就已經初始化過了,如果在過濾器中需要注入spring容器管理的bean是注入不進去的,因此需要在spring監聽器中初始化需要注入的bean,
實現ApplicationContextAware介面,java(new或者java反射獲取的物件)中獲取spring容器的bean
本文參考了https://blog.csdn.net/bailinbbc/article/details/76446594,其實是拷貝了很多內容: 在Web應用中,Spring容器通常採用宣告式方式配置產生:開發者只要在web.xml中配置一個Listener,該Listener將會負責初始化S
spring學習教程5-spring容器管理bean的生命週期
例如:我們需要從容器中獲得一個Bean的物件:1、容器建立該Bean的物件(預設呼叫無參構造器) 2、容器給這個Bean物件注入依賴(預設是set方式) 3、如果這個Bean已經實現了BeanNameAware介面,容器會呼叫它實現的setBeanName(String)方法,此
java 在listener(監聽器) 中使用Spring容器注入bean
今天在SSH的專案開發中,用到了監聽器Listener,並且需要在Listener中使用到Spring容器中的Bean。Spring容器本身就是在web.xml中使用listener的方式啟動的。想在例
在spring中獲取spring容器建立的bean方式
場景:在spring中獲取spring容器建立的bean方式 public static Object getBean(String beanName) { return ContextLoader.getCurrentWebApplicationContext().getB
SpringBoot中實現Spring容器中注入型別相同但名不同Bean
@Bean(autowire = Autowire.BY_NAME,value = "kaptchaProducer") public Producer kaptchaProducer() { Properties kaptcha
框架類---spring---Filter中獲取Spring容器中的bean物件
@Override public void init(FilterConfig filterConfig) throws ServletException { //獲取w
Spring如何管理Java普通類(Java類獲取Spring容器的bean)
方法一:在初始化時儲存ApplicationContext物件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.x
在JSP頁面中呼叫Spring容器注入的Bean的2種方法
方法一: 1.首先在jsp中匯入: <jsp:directive.page import="org.springframework.web.context.WebApplicationContext"/> 2.然後可以呼叫spring容器管理的Bean了(這
在filter中獲取spring容器中的bean物件
在工作中的專案需要,要在filter中使用服務介面,但是採用傳統的new 和注入方式都是空指標異常,最後的解決方式是 @Override public void init(FilterConfig config) throws ServletExce
springMVC中在過濾器中使用spring bean
使用springMVC的專案,web.xml一般是這樣的: <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.sp
Spring容器與bean概要
com init 管理 pass XML efi AC pre color 容器: 通俗的理解容器就是用來管理bean和bean之間依賴的一個組件。很多參考資料說容器就是org.springframework.context.ApplicationContext,但筆者
spring常用管理bean註解
fig tran ebean 構造 control prop repos set resp spring提供了多個註解聲明Bean為spring管理的Bean @Controller 聲明此類是一個MVC類,通常與@RequestMapping一起使用 @Con
Spring容器管理對象和new對象
類的方法 反轉 bean webapp getbean nco ade get 它的 問題:一個業務類交給spring管理,並自動註入了其他業務類作為屬性,方法中通過全局屬性調用其他業務類的方法。當該業務類是通過new獲取的情況下,該實例的屬性會是null(不存在依賴註入實
普通Java類獲取spring 容器的bean的5種方法 Spring注入非單例bean以及scope的作用範圍
本文轉載自:http://www.cnblogs.com/duanxz/archive/2014/06/18/3794075.html 方法一:在初始化時儲存ApplicationContext物件方法二:通過Spring提供的工具類獲取ApplicationContext物件方法三:繼承自抽象類Appli
Spring容器和bean的注入(1)
第一節 在IOC容器中裝配Bean 1.1Spring容器成功啟動條件 1.匯入Spring框架相關的jar包 2.正確配置spring配置檔案 3.Bean的類都已放到應用程式的類路徑下 1.2Bean配置資訊的組成 Bean配置資
spring容器建立bean物件的方式
1)xml檔案中有bean的配置,而且這個bean所對應的java類中存在一個無參構造器,那麼這個時候spring容器就可以使用反射呼叫無參構造器來建立例項了(常規的方式) 2)通過工廠類獲得例項(工廠類實現了介面FactoryBean<?>) 例如: xml中的配置