2012-11-16 108 views
4

我想在我的ajax應用程序中實現表單身份驗證。 我遇到的問題是,當會話過期時,我得到302個代碼,將我重定向到我在web.xml中指定的登錄頁面(並且它將整個應用程序刷新爲登錄頁面)。Ajax和表單身份驗證

我想要做的是獲得「未認證」(401)代碼,然後在彈出窗口中顯示登錄表單,並在登錄成功時繼續執行我正在做的事情。

這裏是正在發生的事情的一個畫面: http://docs.oracle.com/javaee/1.4/tutorial/doc/images/security-formBasedLogin.gif

和文檔 http://docs.oracle.com/javaee/1.4/tutorial/doc/Security5.html

基本上,我想顯示彈出式的,而不是重定向到登錄頁面,然後不做重定向到資源,但以AJAX方式進行更新。 根據我的理解,無法僅在客戶端完成重定向,因爲無法避免重定向(請參閱:redirect info),我需要在服務器上編寫某種邏輯以防止重定向,請參閱此處有關在IIS中執行此操作的詳細信息:IIS implementation

PS到目前爲止,這個:http://www.oracle.com/technetwork/articles/entarch/session-lifecycle-096133.html看起來是實現它的最有前途的方式。這個類已被棄用,但我找不到新的,並認爲這是Weblogic的唯一方法。

+0

我不確定您所談論的web.xml文件是如何工作的,但是如果它所做的只是在會話過期時檢查會話並重定向,那麼您是否可以不在相關頁面上手動編寫該邏輯? – mowwwalker

+0

我不想編寫自己的邏輯來檢查身份驗證/會話過期,我想使用Web容器中可用的Web應用程序 –

+2

您使用的是Servlet 3.0嗎?史前的J2EE教程鏈接和Weblogic標籤建議不要,但只是要求確定,因爲這可以使用Servlet 3.0中的新API設施。否則,你需要回到特定於容器的黑客/解決方法(我認爲很遺憾,很難爲Weblogic獲得答案,因爲社區對這個封閉源代碼容器的支持很低;最好的是你最可能得到的自制認證或採用更靈活的認證框架,如Spring Security或Apache Shiro)。 – BalusC

回答

1

這不是一個簡單的方法,但它仍然工作

你在你的頁面形式,由用戶填寫。

用戶點擊提交按鈕。

ajax請求被髮送到服務器。

服務器端實現可以檢查會話是否存在。並因此可以發送響應代碼401 ..(response.setStatus());

這401可以在客戶端用ajax --- xhr.status

如果響應是401,你可以顯示登錄表單,並隱藏當前的形式進行檢查。使用js和css。

用戶填寫登錄信息,並點擊提交..

你可以爲該登錄請求的狀態相同的服務器端檢查和客戶端檢查。

如果登錄成功,那麼你可以,你可以使用AJAX或JS提交的第一種形式..

+0

我認爲我的服務器端代碼在會話過期後運行,所以我無法檢查代碼或設置狀態中的任何內容。 –

+0

哦,是的,它應該。我已經使用過的任何技術,讓我們來重寫超時行爲,或者訂閱會話超時事件。 – Tengiz

0

你可以使用一個心跳與一個Ajax請求你的服務器需要進行身份驗證,以獲得任何資源檢驗它..如果你不能接受這種資源就意味着你不在登錄..所以你可以發送另外的認證請求與您呈現一個去..

看到這篇文章.. http://ajaxpatterns.org/archive/Heartbeat.php

讓你檢查認證程序將實施。

+0

但是,如果我經常這樣做,心跳會延長會話。我可能會在每次提交之前做一個「測試」消息,但不確定這是最好的方法。 –

0

您需要將頁面和不輪詢。所以你需要Strophe和你的會話處理程序連接。當會話過期時,信號被髮送到正在您的Web應用程序中運行的Strophe實例,之後很容易執行彈出窗口或其他操作。 對於我使用Strophe的所有實時東西!

This is book這個metter,這是link for Strophe,這也是php xmpp class的鏈接。

這將花費你幾天的時間來弄清楚這一點,但它是花了好幾天! 如果您仔細閱讀並閱讀示例,只需基本的javascript/jquery理解,就可以開發功能強大的Web應用程序。

-1

我知道你正在試圖做的FORM認證與你ajax應用程序,但它是真的需要

BASIC身份驗證對於AJAX請求更簡單,透明,因爲它是由瀏覽器處理的,而不是由您的應用處理。但我承認/理解一個彈出窗口很醜陋。