国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Spring mvc 中有關 Shiro 1.2.3 配置問題

2019-11-14 21:15:32
字體:
來源:轉載
供稿:網友
SPRing mvc 中有關 Shiro 1.2.3 配置問題

Spring 版本:3.2.x, 4.0.x

【問題說明】

首先介紹下配置出錯情況:

(1)項目中,Spring3 and Spring4 的 applicationContext.xml aop 配置如下:

... ...   <aop:aspectj-autoproxy expose-proxy="true"/>       <tx:annotation-driven transaction-manager="transactionManager"/>   <tx:advice id="txAdvice" transaction-manager="transactionManager">        <tx:attributes>            <tx:method name="save*" propagation="REQUIRED" />            <tx:method name="add*" propagation="REQUIRED" />            <tx:method name="create*" propagation="REQUIRED" />            <tx:method name="insert*" propagation="REQUIRED" />            <tx:method name="update*" propagation="REQUIRED" />            <tx:method name="del*" propagation="REQUIRED" />            <tx:method name="get*" propagation="REQUIRED" read-only="true" />            <tx:method name="find*" propagation="REQUIRED" read-only="true" />            <tx:method name="query*" propagation="REQUIRED" read-only="true" />            <tx:method name="*"  read-only="true"/>        </tx:attributes>    </tx:advice>       <aop:config expose-proxy="true">        <!-- 只對業務邏輯層實施事務 -->        <aop:pointcut id="txPointcut" expression="execution(* com.app..service..*.*(..))" />        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>    </aop:config>... ...

未加入 Shiro 之前,所有 applicationContext 的 getBean(...) 方法能正常獲取到相應對象實例。 調用getBeanDefinitionNames()輸出的 Beans 如下:

Bean NameBean Class
userDaoImplclass com.app.dao.impl.UserDaoImpl
resourceServiceImplclass com.app.service.impl.ResourceServiceImpl$$EnhancerBySpringCGLIB$$4ddf6901
roleServiceImplclass com.app.service.impl.RoleServiceImpl
userServiceImplclass com.app.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$e7bcd944

以上 bean 都采用 @Repository 或@Service 的注解方式。

注意標紅Class名稱,這是因為被 CGLIB 動態代理。

(2)根據 Shiro 示例,新增配置文件 applicationContext-security.xml,然后配置Shiro 如下:

... ...    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">        <property name="realm" ref="myRealm"/>    </bean>    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">    </bean>    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">        <property name="securityManager" ref="securityManager"/>    </bean>         <bean id="formAuthenticationFilter"  class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter"/>... ...

加入 Shiro 之后,發現有些地方 getBean(...) 出錯,調用getBeanDefinitionNames()輸出的 Beans 如下:

Bean NameBean Class
userDaoImplclass com.app.dao.impl.UserDaoImpl
resourceServiceImplclass $Proxy38
roleServiceImplclass com.app.service.impl.RoleServiceImpl
userServiceImplclass $Proxy32

可以注意到標紅Class名稱,這是由于配置 DefaultAdvisorAutoProxyCreator,又被 JDK 動態二次代理。

【解決辦法】

兩次都以 CGLIB 動態代理。在 AOP 配置加上proxy-target-class 屬性,值為 true。具體如下:

(1)在 applicationContext.xml 中配置

... ...    <aop:config expose-proxy="true" proxy-target-class="true">        <!-- 只對業務邏輯層實施事務 -->        <aop:pointcut id="txPointcut" expression="execution(* com.app..service..*.*(..))" />        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>    </aop:config>... ...

(2)在 applicationContext-security.xml 配置 Shiro

... ...    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">        <property name="proxyTargetClass" value="true"/>      </bean>... ...

修改完成后,重新運行程序,getBean 恢復正常。

【參考資料】

spring的二次代理原因及如何排查 http://jinnianshilongnian.VEvb.com/blog/1894465


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 正定县| 黔南| 佛教| 甘谷县| 莒南县| 霍山县| 南和县| 简阳市| 丘北县| 山西省| 清水县| 黄龙县| 青田县| 积石山| 南郑县| 双牌县| 盖州市| 北辰区| 永顺县| 天全县| 扬中市| 饶河县| 大竹县| 东丽区| 安徽省| 濮阳县| 仪征市| 辽宁省| 巴林左旗| 永城市| 综艺| 绥江县| 陵川县| 会昌县| 齐齐哈尔市| 洪雅县| 炉霍县| 沾化县| 南乐县| 灵台县| 临沭县|