区分URL用户名和基本身份验证用户名?

时间:2016-01-03 11:28:15

标签: java http servlets java-ee basic-authentication

假设浏览器已发送网址:

http://user1:password1@myhost.com/index.html

此网址是否可以使用http Authorization标题中的不同用户名/密码对进行发送?

例如:

       $http({
            method: 'GET',
            url: 'http://user1:password1@myhost.com/index.html',
            headers: {
                'Authorization': 'Basic ' + btoa('username2:password2')
            }
        })

如果是,那么如何用HttpServletRequest区分这些地方?

HttpServletRequest#getRemoteUser()返回哪一个?

如何获得另一个?

更新

根据我的Fiddler观察,即使明确传递了网页客户端,也不会在URL中保留用户名和密码。相反,它将用户名和密码放入Authorization标头中。如果不同的值通过javascript传递不同会发生什么,我不知道。无论如何,只发送一个用户名:密码已付。

但后来对错误代码的行为有所不同。如果在URL中传递了密码,则浏览器在401错误时不显示授权对话框。可能这取决于浏览器。

2 个答案:

答案 0 :(得分:1)

来自标题:

String header = request.getHeader("Authorization") 

然后解码它。

来自网址:

URL url = new URL(request.getRequestURL()); //http://username:password@hostname.com
String userInfo = url.getUserInfo() // username:password

https://docs.oracle.com/javase/7/docs/api/java/net/URL.html#getUserInfo()

用户名/密码应该在标头中传递,而不是URL的一部分。浏览器似乎可以跳过它而不是URL。

答案 1 :(得分:0)

网址中的用户名和密码不会发送到服务器。浏览器输入它们只是一个方便的功能,浏览器会将它们放入/复制到Authentication标题中。