我创建了一个BasicAuthFilter
,它有这个签名:
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException
如果有人以正确的方式设置了Authorization标头来调用过滤器,则此功能正常。但是,如果有人在chrome或firefox上访问这样的网址:
http://username:password@localhost:8888
浏览器没有使用该信息填充Authorization标头(这让我感到惊讶)。我查看了chrome发送的信息,用户名和密码在请求URL中,但不在其他地方。
我无法弄清楚如何从URL中提取该信息。我在HttpServletRequest
上尝试了很多getter,但没有找到任何能给我输入用户名和密码的东西。
注意:是的,我知道这是不安全的,在您尝试测试系统时使用它真的很方便。
答案 0 :(得分:3)
我的同事发现this thread暗示这在现代浏览器中是不可能的。出于安全原因,他们拒绝在网上发送用户名:密码的一部分。
答案 1 :(得分:1)
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 :(得分:-3)
我将向此answer
添加内容如果密码包含字符:
,则必须指定分割限制。
所以:
String[] userInfoArray = userInfo.split(":");
变为:
String[] userInfoArray = userInfo.split(":", 2);
2
表示模式:
仅应用一次(因此生成的长度数组最多为2)
答案 3 :(得分:-3)
对于带有'@'的密码,例如"http://user:p@ssw0rd@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()
无效,因为userInfo
的{{1}}为URI
。