java - 通过套接字从浏览器到服务器的基本 http 身份验证

标签 java sockets http

我正在尝试编写一个简单的 Java 服务器,它从 Web 浏览器接收 HTTP GET 请求并发回一些数据。所有通信都通过套接字完成。

我能够处理请求,现在我正在尝试使用 BASIC AUTH 实现简单的身份验证,因此只有在请求 header 中提供正确的凭据时才会处理某些请求。为了简单起见,我只使用 http 协议(protocol)(而不是 https)。不过,我不确定如何访问 header 并读取服务器上的凭据:

服务器在本地主机上运行,​​端口 9000,这是我尝试处理的示例 URL:

http://user:password@localhost:9000/files/text?tid=file3

我打开套接字并读取所有内容:

InputStream input = clientSocket.getInputStream();

// Reading line by line with a BufferedReader
java.io.BufferedReader in = new java.io.BufferedReader(new String line;
while (!(line = in.readLine()).equals("")) {
    System.out.println(line);
}

这是我得到的:

GET /files/text?tid=file3 HTTP/1.1
Host: localhost:9000
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/41.0.2272.76 Chrome/41.0.2272.76 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

我在 URL 中输入的身份验证凭据没有踪迹,因此我不确定如何解析请求。你能告诉我我在这里缺少什么吗?

我知道这个例子非常简单,还有更聪明的方法来实现它,但我很好奇如何在这个简单的模型案例中访问这些凭据。

最佳答案

使用类似 curl 的客户端:

$ curl -v -u user:password "http://localhost:9000/files/text?tid=file3"

由于 HTTP 是无状态的,发送 Authentication header 就足够了。这就是 curl 所做的。无需等待服务器返回 401

关于java - 通过套接字从浏览器到服务器的基本 http 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29603666/

相关文章:

c++ - 在调用 recv() 之前检查错误

iphone - 如何在防火墙后面的 iPhone 上设置 http 服务器

java - 使用 xmlbeans 时使用反射创建实例

java - 使用回调异步加载 ListView 中的图像

java - URLConnection 错误 - java.io.IOException : Server returned HTTP response code: 400 for URL

java - Android JavaMail 检测服务器是否离线

c - 套接字上带有 sendfile 的管道 C 损坏

c# - 使用 C# 通过 LAN 与 Python 发送/接收文件

java - DefaultHttpClient 已弃用 Android Studio 2.2.2

javascript - SailsJS : POST requests are not resolved properly when invoking req. param() 和 req.file()