我正在使用JBoss 7.1并使用基本身份验证保护我的Web应用程序但我只希望第一次调用需要Basic身份验证标头,后续调用应使用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,但在查看fiddler时,我看到第一个调用的行为符合预期。首先,您获得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
任何想法我都缺少。