2012-08-23 56 views
0

我有加入的Apache四郎該JSF 2.0 /春季應用和重定向後會話超時不會發生當上的命令按鈕用戶點擊或觸發一個AJAX請求。它在刷新瀏覽器時工作。這發生在所有瀏覽器中。這是我的applicationContext.xml:JSF 2 +彈簧3 +四郎 - 會話超時不重定向到登錄頁面

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
     <property name="securityManager" ref="securityManager" /> 
     <property name="loginUrl" value="/index.faces"/> 
     <property name="filterChainDefinitions"> 
       <value> 
         /* = authc 
       </value> 
     </property> 
</bean> 
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
     <property name="realm" ref="opacsRealm" /> 
</bean> 

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> 

<bean id="sha512Matcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> 

     <property name="hashAlgorithmName" value="SHA-256" /> 
     <property name="hashIterations" value="1024" /> 
</bean> 



<bean id="opacsRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="authenticationQuery" 
       value="select PASSWORD, SALT from SEC_USERS where NAME = ?" /> 
     <property name="userRolesQuery" 
       value="SELECT ROLE_NAME FROM SEC_USERS_ROLES WHERE USER_NAME = ?" /> 
     <property name="permissionsQuery" 
       value="SELECT permission FROM SEC_ROLES_PERMISSIONS WHERE ROLE_NAME = ?" /> 
     <property name="permissionsLookupEnabled" value="true" /> 
     <property name="saltStyle" value="COLUMN" /> 
     <property name="credentialsMatcher" ref="sha512Matcher"/> 
</bean> 

我在做錯了什麼設置?在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>/*</url-pattern> 
</filter-mapping> 
<session-config> 
    <!-- web.xml expects the session timeout in minutes: --> 
    <session-timeout>1</session-timeout> 
</session-config> 
+0

只是踢,我改變了authc使用自定義FormAuthenticationFilter和推翻的redirectToLogin方法和添加回父類的代碼。沒有改變,但我添加到方法的日誌語句打印,所以重定向正在發生,但瀏覽器從不重定向,除非刷新完成。 –

+0

我沒有給你一個答案,但我可以告訴你,這很可能是事先設計好的。通過這種配置,當會話超時時,authc過濾器會將任何ajax請求重定向到登錄頁面。但是,爲了將頁面刷新到登錄頁面,javascript需要解釋302響應並刷新頁面。這已經四郎用戶列表最近討論,我相信提問者找到一個合適的解決方案:http://shiro-user.582556.n2.nabble.com/Web-Filter-to-return-HTTP-status-code -td7577672.html – jbunting

+0

我剛剛讀到那個謝謝。他沒有回答他的解決方案,所以我會看看我能否從他的帖子中找出答案。 –

回答

2

剛剛回復到您的郵件。正在發生的事情是,重定向無縫地通過在Ajax調用的瀏覽器,以便四郎不重定向到登錄頁面,您的Ajax請求的最終結果是處理登錄頁面,這是不是真的,你想要什麼的HTML內容!

如何解決這個要點是增加一個(自定義)四郎過濾器,你的Ajax API網址來檢查被證實,而不是重定向到登錄返回響應你的Ajax請求的理解,以表明受試者用戶沒有登錄。那麼這個響應的客戶端處理可以做一個重定向到登錄頁面(或者在同一頁面,因爲四郎將然後重定向到登錄,但可以配置要記住,你試圖去,因此採取用戶在成功登錄後返回到正確的頁面)。

我的過濾器實現返回Http代碼401以及「WWW-認證」頭和一個自定義的「挑戰方案」(如果你做了基本認證挑戰,那麼瀏覽器會彈出它的基本認證對話框 - 已經有一個Shiro過濾器這樣做)。

在你的Ajax調用中,你需要檢測到這個響應,目前我有一個笨重的錯誤回調,但是我認爲應該可以修改JavaScript庫(JQuery,無論)來處理這個無縫的。

+0

該部分確實有效,並且我已將ajax組件重定向到登錄頁面。與此相關的最後一個問題是頁面刷新。我可以使用onunload來捕獲頁面刷新,但如果它在會話超時後發生,頁面將消失。我已經在頁面中放置警報,以便在DOM刷新等特定事件發生時彈出,但在會話超時後頁面刷新時沒有彈出窗口。有什麼辦法可以解決這個問題嗎?下面是一些代碼段我已經試過: –

+0

試圖格式化代碼,但我忘了如何:jQuery的(文件)。就緒(函數(){ \t \t \t VAR請求= jQuery.ajax({ \t \t \t \t網址: 「viewJobActivity。面」, \t \t \t \t類型: 「POST」 \t \t \t \t}); \t \t \t \t request.done(函數(MSG){ \t \t \t \t \t警報( '完成'); \t \t \t \t}); \t \t \t \t request.fail(function(jqXHR,textStatus){ \t \t \t \t alert(「Request failed:」+ textStatus); \t \t \t \t}); \t \t}); –

+0

另一種方式我想:\t \t \t \t'jQuery.ajax( \t \t \t \t { \t \t \t \t \t //定義AJAX性能 \t \t \t \t \t方法: 「GET」, \t \t \t \t \t url:「viewJobActivity.faces」, \t \t \t \t \t //定義succss方法。 \t \t \t \t \t成功:函數(){ \t \t \t \t \t \t警報(! 「成功」); \t \t \t \t \t}, \t \t \t \t \t //定義誤差的方法。 \t \t \t \t \t錯誤:函數(objAJAXRequest,STRERROR){ \t \t \t \t \t \t警報( 「錯誤類型:」 + STRERROR); \t \t \t \t \t} \t \t \t \t} \t \t \t \t);' –

相關問題