Servlets 如何在servlet过滤器中从URL中提取用户名和密码?

Servlets 如何在servlet过滤器中从URL中提取用户名和密码?,servlets,basic-authentication,servlet-filters,Servlets,Basic Authentication,Servlet Filters,我已经创建了一个BasicAuthFilter,它有以下签名: @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 如果有人以正确的方式调用设置了授权标头的筛选器,则此操作有效。但是,如果c

我已经创建了一个
BasicAuthFilter
,它有以下签名:

@Override
public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain) throws IOException, ServletException 
如果有人以正确的方式调用设置了授权标头的筛选器,则此操作有效。但是,如果chrome或firefox上有人访问url,则如下所示:

http://username:password@localhost:8888
浏览器没有用这些信息填充授权头(这让我很惊讶)。我查看了chrome发送的信息,用户名和密码在请求URL中,而不是其他地方

我不知道如何从URL中提取这些信息。我在
HttpServletRequest
上尝试了很多getter,但没有找到任何提供用户名和密码的内容


注意:是的,我知道这是不安全的,当您尝试测试您的系统时,使用它非常方便

我的同事发现这意味着这在现代浏览器中是不可能的。出于安全原因,他们拒绝通过网络发送url的用户名:密码部分

我会给这个添加一些内容

    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]);   
如果密码包含字符
,则必须指定拆分限制

因此:

变成:

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

2
表示模式
仅应用一次(因此生成的长度数组最多为2)

用于带“@”的密码,例如
”http://user:p@ssw0rd@private.uri.org/部分/服务“


请注意,在这种情况下,尝试使用
getUserInfo()
不会有帮助,因为
URI
userInfo
null

您可以手动解析URL字符串……如果执行字符串URL=request.getRequestURI(),会发生什么情况;然后手动解析?@janvladimirmoster它包含我的主机后面的路径。@MonadNewb我很想这样做,但我不知道如何获取完整的URL。我对此做了一些研究,但每当我尝试使用url时,url中都没有用户名/密码。@MonadNewb过滤器接收到来自浏览器的请求。我没有
URL
对象,我有一个
ServletRequest
。我在问如何从该签名中的参数中获取用户名和密码。这意味着您应该像我建议的那样从
授权
标题中提取用户名和密码。您没有收到头的事实很奇怪-我会首先尝试使用端口8080,如果这不起作用,请尝试在远程计算机(而不是本地主机)上隔离问题。
String[] userInfoArray = userInfo.split(":", 2);
    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);
            }
        }
    }