2012-07-20 53 views
0

如預期的那樣,使用以下代碼和默認配置(glassfish 3.1.2中的HTTP基本身份驗證+文件領域)來請求客戶端的憑據。但是,刷新後甚至在瀏覽器中的新選項卡上(即使不允許使用cookie,也不存儲密碼),客戶端不會再被要求重新輸入憑據。只有當瀏覽器關閉並重新打開時,客戶端纔會再次詢問憑據。如何進行身份驗證?HttpServletRequest.authenticate不要求重新登錄

public class AuthenticateServlet extends HttpServlet { 

    protected void processRequest(HttpServletRequest request, 
      HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      request.authenticate(response); 
      out.println("Authenticate Successful"); 
     } finally { 
      request.logout(); 
      out.close(); 
     } 
    } 

[...] 

} 

問候,

邁克

- 編輯 -

的問題提出了同時使用程序安全性的方法進行實驗。在重新啓動的客戶端瀏覽器中使用以下代碼時,第一個println語句會引發NPE。登錄窗口甚至不會出現在客戶端瀏覽器中。然而,當println語句被刪除時,登錄窗口確實出現並且登錄工作。當再次添加println語句(並且不重新啓動瀏覽器)時,它們將被打印。我也嘗試將println-Statements移入另一個try/catch-block,但這似乎沒有什麼區別。

try { 
     request.authenticate(response); 

     out.println("<p>Principal's name: " + request.getUserPrincipal().getName() + "</p>");  <== NPE 
     out.println("<p>is that user in role 'gruppeA': " + request.isUserInRole("a_gruppe") + "</p>"); 
     out.println("<p>remote User is: " + request.getRemoteUser() + "</p>"); 
     out.println("Authenticate Successful"); 
    } catch (ServletException ex) { 
     out.println("Login Failed with a ServletException." + ex.getMessage()); 
     return; 
    } finally { 
     out.close(); 
    } 

這使我想到如何驗證工作以及如何使用它。可能的,身份驗證會在瀏覽器發生登錄並將該信息存儲在服務器中時記住。可能不是。

我試過,順便說一句,使會話無效。然而,不需要新的登錄名(這符合我原來的帖子,我 - 用於測試 - 在客戶端瀏覽器中禁用cookie)。

回答

1

身份驗證憑據緩存在某處,它看起來像基於會話。 你可以檢查一個方法來清除服務器中的會話,但你也可以綁定一些servlet或許/清除並調用request.getSession()。invalidate()

我認爲這是非常標準的緩存憑據和有時瀏覽器也會這樣做,你的特定用例是什麼?