我正在使用 JBoss 7.1 并已使用基本身份验证保护我的 Web 应用程序,但我只希望第一次调用需要基本身份验证标头,后续调用应使用 jsessionid 进行身份验证。如何做到这一点?
到目前为止,我已经创建了一个 rest servlet,通过调用 request.getSession() 来强制创建会话
@Path("/rest/HelloWorld")
public class HelloWorld {
@GET()
@Produces("text/plain")
public String sayHello(@Context HttpServletResponse response,
@Context HttpServletRequest request) {
HttpSession session = request.getSession();
return "Hello World! " + request.getUserPrincipal().getName();
}
我的想法是任何其他调用都应该只需要 jsessionid cookie,但是在查看提琴手时,我发现第一个调用的行为符合预期。首先,您得到一个 401 并且客户端正在重新发送,包括基本授权标头,并返回一个 jsessionid。在第二次调用中包含 jsessionid cookie,但我仍然得到一个 401 触发客户端重新发送基本授权标头。
这是成功通过身份验证的第一次调用返回的标头。
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET
Set-Cookie: JSESSIONID=AFDFl2etiUNkn-mpM+DXr3KE; Path=/Test
Content-Type: text/plain
Content-Length: 18
Date: Tue, 29 Jan 2013 09:12:48 GMT
Hello World! test1
当我打第二个电话时, jsessionid 包括在内
GET /Test/index.html HTTP/1.1
Host: cwl-rickard:8080
Cookie: JSESSIONID=AFDFl2etiUNkn-mpM+DXr3KE
我得到一个 401 强制客户端重新发送包括基本授权标头的请求。
HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET
WWW-Authenticate: Basic realm="ApplicationRealm"
Content-Type: text/html;charset=utf-8
Content-Length: 958
Date: Tue, 29 Jan 2013 09:12:48 GMT
任何我想念的想法。