通过套接字从浏览器到服务器的基本http认证

时间:2015-04-13 10:57:36

标签: java sockets http

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

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

服务器在localhost,端口9000上运行,这是我尝试处理的示例网址:

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

我没有在网址中输入身份验证凭据,因此我不确定如何解析请求。你能告诉我在这里我错过了什么吗?

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

1 个答案:

答案 0 :(得分:1)

使用curl之类的客户端:

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

由于HTTP是无状态的,因此发送Authentication标头就足够了。这就是curl的作用。没有必要等待服务器返回401