1. 程式人生 > >在Shiro的過濾器中新增Spring容器管理的Bean

在Shiro的過濾器中新增Spring容器管理的Bean

在web.xml中進行配置,對所有的URL請求進行過濾,就像"擊鼓傳花"一樣,鏈式處理。

配置分為兩種A和B。

A:普通配置

在web.xml中增加如下內容:
<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:高階配置

(允許代理注入Spring bean)

在web.xml中增加如下內容:
<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中的配置