2011-11-30 97 views
4

我有一個情況如下:通過Servlet驗證

我有2個Web應用程序運行在Tomcat上。最初,用戶已登錄到應用程序1,然後。有一個鏈接到應用程序2.在點擊鏈接用戶應該被重定向到第二個應用程序。

這兩個應用程序都使用LDAP身份驗證。

現在,這裏的問題是第二個應用程序有它自己的身份驗證系統。

因此,我們計劃隱式驗證在第一個系統中登錄的用戶。

我已經寫了一個servlet,當我在App1中點擊App2的鏈接時,它會被執行。

我想使用下面的代碼,它應該在給定的參數上調用app2上的Servlet「ldap-login」。參數名稱是正確的。

String targetURL = "http://localhost:8080/app2/ldap-login"; 

    HttpClient client = new HttpClient(); 

    PostMethod doPost = new PostMethod(targetURL); 

    //doPost.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, true); 
    doPost.addParameter("login_netid", "alice"); 
    doPost.addParameter("login_password", "alice"); 
    try { 
     int status = client.executeMethod(doPost); 
     if (status == HttpStatus.SC_OK) { 
      // redirect 
      response.sendRedirect("http://localhost:8080/app2/myPage"); 
     } else { 
      System.out.println("Service failed, Response Code= " +     
       HttpStatus.getStatusText(status)); 
      System.out.println("Response Body --> " + doPost.getResponseBodyAsString()); 
     } 
    } catch (Exception ex) { 
     System.out.println("ERROR: " + 
     ex.getClass().getName() + " "+ ex.getMessage()); 
     ex.printStackTrace(); 
     } finally { 
       doPost.releaseConnection(); 
     } 

但我得到響應「暫時移動」。

任何人都可以建議我任何替代?

+0

如果您從瀏覽器執行相同的POST操作(使用簡單表單提交),它的行爲如何? – srkavin

+0

當我從瀏覽器使用POST執行相同的操作時,它表現完美。 –

回答

1

A 302移動臨時響應只是一個重定向。這正是你在做response.sendRedirect()時得到的迴應。作爲對成功登錄的響應,您也可以很好地獲得重定向。我建議在第二個應用程序上驗證它是否確實在登錄成功時重定向。然後,您應該檢查響應代碼是否是302,而不是200.或者,您需要告訴HttpClient自動執行任何重定向。

更重要的是,如果登錄失敗,您會從第二個應用程序獲得什麼樣的響應?它會拋出異常並返回500的響應碼嗎?或者它是否會有條件地在請求範圍中設置一些錯誤消息,並通過轉發重新顯示JSP,從而保持響應代碼爲200?那麼您如何區分登錄成功時登錄失敗200次和登錄失敗200次?


無關的具體問題,你的方法可能不會,如果第二個應用程序不共享同一個會話作爲第一個應用程序。登錄通常存儲在會話中,但您不在任何地方維護會話。無論如何,這是一個新的問題:)

+0

我已經在第二個應用程序中檢查過。它確實重定向成功的身份驗證,我認爲這就是我得到302作爲響應代碼的原因,但頁面沒有改變。它在身份驗證成功後保持在同一頁面上。如果你可以提出任何替代方案,將非常感激。 –

+0

這絕對是你得到302的原因。'response.sendRedirect()'默認設置爲302.另見http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 .3.3如果您看到相同的頁面,那麼它只是重定向到自己。這可能是有目的地完成以獲得新的新要求,或者只是糟糕的設計。有關詳細信息,請聯繫該servlet的作者。 – BalusC

+0

感謝您的快速回復。那麼,作者是我無法聯繫的其他人。我已經查看了應用程序2的servlet並將參數修改爲「String originalURL =」http:// localhost:8080/jspui/mydspace「;」然後response.sendRedirect(response.encodeRedirectURL(originalURL));這是我想要重定向用戶的URL。 –

0

根據API doc,sendRedirect呼叫做臨時重定向。正如@BalusC提到的,您需要處理響應代碼SC_MOVED_TEMPORARILYSC_FOUND

它在登錄後執行重定向的原因(或可能在任何POST請求後)可能是爲了避免Double Submit ProblemHere是另一篇文章。