REST服务基本auth会话超时

Run*_*lse 2 rest session web.xml basic-authentication

我正在使用基本身份验证开发一个安静的Web服务.在web xml中我有以下内容:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Services</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>User</role-name>
    </auth-constraint>
</security-constraint>
<session-config>
    <session-timeout>1</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)

这按预期工作:用户在与服务交互时必须提供密码.

但是,为了符合更多RESTful标准,我认为它应该是一个永远不会创建会话的无状态服务.换句话说,我想强制客户端为每个请求提供凭据.

如果我在web-xml中将session-timeout设置为0,则会将其解释为"never expire",这与我想要的完全相反.

是否有一种简单的方法可以使会话立即失效?

小智 6

您根本不需要<session-config>元素.

您体验的是浏览器如何实现身份验证协议.

简而言之,基本身份验证(rfc 2617)的工作方式如下:

  1. 客户端请求一些资源.
  2. 服务器识别该资源具有安全性约束.因此,它发送HTTP 401"需要授权"响应.标题包含类似......

    WWW-Authenticate: Basic realm="Protected"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 客户端重新发送其请求,但这次使用标头中的凭据(base64编码),例如......

    Authorization: Basic dG9tY2F0OnMzY3JIdA==
    
    Run Code Online (Sandbox Code Playgroud)
  4. 服务器根据给定的凭据对请求进行身份验证,并发送请求的资源.

为了方便人们进行网页浏览,几乎每个浏览器都会缓存凭据,直到浏览器关闭为止.每次在浏览器中重新加载页面时,"授权"条目都会与请求的标头一起发送.因此,在使用浏览器测试Web服务时,不会再要求您提供凭据.

使用Firefox,您可以控制该行为.查看有关Firefox的讨论,快速忘记HTTP Basic Auth.