如果我为我的Web应用程序的文件web.xml中的某些URL添加元素<security-constraint>
,我的servlet容器(比如Tomcat)将保护这些URL并将未经身份验证的用户重定向到登录页面。
但是,servlet容器如何识别来自经过身份验证的用户的请求?
他们期望:
特别是,Tomcat在经过身份验证的用户的请求中寻找什么?
这是web.xml文件的一部分,根据常见教程中的示例。 servlet容器(特别是Tomcat)在请求中查找什么以将其标识为来自经过身份验证的用户?
<security-constraint>
<display-name>Restricted GET To Employees</display-name>
<web-resource-collection>
<web-resource-name>Restricted Access - Get Only</web-resource-name>
<url-pattern>/restricted/employee/*</url-pattern>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Employee</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>MyRealm</realm-name>
<form-login-config>
<form-login-page>/login/loginForm.jsp</form-login-page>
<form-error-page>/login/loginError.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>Employee</role-name>
</security-role>
答案 0 :(得分:1)
我认为JSESSIONID cookie用于识别客户端,如Servlet Specification (PDF)中所定义:
通过HTTP Cookie进行会话跟踪是最常用的会话跟踪机制 并且需要所有servlet容器都支持。 容器向客户端发送cookie。然后客户端将返回cookie 每个后续的服务器请求,明确地将请求与a关联 会话。会话跟踪cookie的标准名称必须是JSESSIONID, 所有3.0兼容容器必须支持。容器可能允许 要通过特定于容器自定义的会话跟踪cookie的名称 配置。
查看Tomcat中如何进行身份验证,执行登录后,调用org.apache.catalina.authenticator.AuthenticatorBase#register(org.apache.catalina.connector.Request, javax.servlet.http.HttpServletResponse, java.security.Principal, java.lang.String, java.lang.String, java.lang.String, boolean, boolean)
方法,该方法缓存身份验证信息,org.apache.catalina.authenticator.AuthenticatorBase#checkForCachedAuthentication
中的后续请求将重用该方法,以允许经过身份验证的用户继续,无需再次提供凭证。
这意味着虽然用户不必通过身份验证即可拥有有效会话(由JSESSIONID
cookie标识),但一旦他们登录,他们的身份验证信息就会被缓存并绑定到他们的会话,所以当用户发出新请求时,应用程序服务器将其识别为已通过身份验证,并允许访问受保护资源。