2013-08-23 36 views
2

我創建了一個BasicAuthFilter,它有這樣的簽名:如何從servlet過濾器中的URL中提取用戶名和密碼?

@Override 
public void doFilter(ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) throws IOException, ServletException 

這是工作,如果有人要求與Authorization頭設置正確的方式過濾。但是,如果有人對Chrome或Firefox訪問的URL是這樣的:

http://username:[email protected]:8888 

的瀏覽器未填入的信息(這讓我吃驚)Authorization頭。我查看了chrome發送的信息,用戶名和密碼位於請求URL中,但沒有其他地方。

我無法弄清楚如何從URL中提取信息。我在HttpServletRequest上嘗試了很多獲得者,但沒有找到任何能夠給我用戶名和密碼的東西。

注:是的,我知道這是不安全的,當您嘗試測試您的系統時使用它非常方便。

+1

你*可以*手動解析URL字符串... –

+1

如果你做了什麼String url = request.getRequestURI();只是手動解析它? –

+1

@JanVladimirMostert它包含我的主機後的路徑。 –

回答

2

我的同事發現this thread,這意味着這在現代瀏覽器中是不可能的。由於安全原因,他們拒絕發送網址上的用戶名:密碼部分。

+0

這意味着你應該從'Authorization'頭部提取它,就像我建議的那樣。事實上,你沒有收到標題是奇怪的 - 我會先嚐試使用端口8080,如果這不起作用,嘗試在遠程機器(不是本地主機),以隔離問題。 – alfasin

0
URL url = new URL(custom_url); 
    String userInfo = url.getUserInfo(); 

    String[] userInfoArray = userInfo.split(":"); 
    System.out.println("username"+userInfoArray[0]); 
    System.out.println("password"+userInfoArray[1]); 
-2

我補充一下這個answer

如果密碼包含字符:,您必須指定在分裂的限制。

所以:

String[] userInfoArray = userInfo.split(":"); 

變爲:

String[] userInfoArray = userInfo.split(":", 2); 

2意味着圖案:僅施加一個時間(因此所得到的長度數組是在最大2)

-2

對於密碼'@',例如"http://user:[email protected]@private.uri.org/some/service"

final String authority = uri.getAuthority(); 

    if (authority != null) { 
     final String[] userInfo = authority.split(":", 2); 

     if (userInfo.length > 1) { 
      this.username = userInfo[0]; 
      int passDelim = userInfo[1].lastIndexOf('@'); 

      if (passDelim != -1) { 
       this.password = userInfo[1].substring(0, passDelim); 
      } 
     } 
    } 

注意,在這種情況下,試圖用getUserInfo()不會幫助,因爲URIuserInfonull

相關問題