2009-05-06 136 views
2

我需要根據URI子集來識別用戶。它有以下模式http://[email protected]:port/path使用URI userinfo組件進行驗證http:// userinfo @ hostname:servlet中的端口/路徑

java.net.URI(http://java.sun.com/j2se/1.4.2/docs/api/java/net/URI.html)實現表示URI。但是,在servlet中,我無法檢索包含「userinfo」URI組件的URL/URI。我認爲方法HttpServletRequest.getRequestURL()會返回一個完整的URL,但在某個階段,「userinfo」組件被壓制或忽略。

我意識到,當使用curl而不是Firefox來請求servlet時,它會向標頭添加一個http基本授權。那麼,它可能與HTTP客戶端實現有關?調用者可以禁止「用戶信息」組件?

以下代碼只是遍歷頭並嘗試讀取用戶信息組件。

@SuppressWarnings("unchecked") 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // 
    try { 

     PrintWriter out = response.getWriter(); 

     String header; 
     for (Enumeration e = request.getHeaderNames(); e.hasMoreElements();) { 
      header = e.nextElement().toString(); 
      out.println(header + ": " + request.getHeader(header)); 
     } 

     URI uri = new URI(request.getRequestURL().toString()); 

     out.println("request uri: " + request.getRequestURI()); 
     out.println("request url: " + request.getRequestURL()); 
     out.println("userinfo: " + uri.getUserInfo()); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 

} 

在此先感謝!

回答

1

用戶名和密碼作爲HTTP身份驗證的一部分傳遞,而不是URL的一部分。特別是,瀏覽器將永遠不會發送它,除非它被要求通過401未經授權的響應。

你可以看到如何在一個servlet這裏實現HTTP認證的一些例子:http://docstore.mik.ua/orelly/java-ent/servlet/ch08_01.htm