2

我需要根据 URI 子集来识别用户。它具有以下模式http://userinfo@hostname:port/path

java.net.URI实现表示 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();
    }
   
}

提前致谢!

4

1 回答 1

1

用户名和密码作为 HTTP 身份验证的一部分传递,而不是 URL 的一部分。特别是,浏览器永远不会发送它,除非它通过 401 未授权响应被要求发送。

您可以在此处查看如何在 servlet 中实现 HTTP 身份验证的一些示例:http: //docstore.mik.ua/orelly/java-ent/servlet/ch08_01.htm

于 2009-05-06T04:59:32.813 回答