我正在为我的Web应用程序使用tomcat基本身份验证:
我在网络应用程序的web.xml中添加了以下几行:
<security-constraint> <web-resource-collection> <web-resource-name>webpages</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>*</role-name> </auth-constraint> <user-data-constraint> <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE --> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> </login-config> <security-role> <role-name>*</role-name> </security-role>
我的注销链接:
<h:commandLink value="Logout" action="#{userBean.logout}" />
我的注销链接操作:
public void logout() throws IOException { FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); FacesContext.getCurrentInstance().getExternalContext().redirect("add_international_job.faces"); }
现在,当调用注销时,它将重定向到另一个页面,该页面需要进行身份验证。但它是在用户登录时呈现的。PS:当用户首次在地址栏中键入同一页面的url时,会向他提出身份验证挑战(这意味着对该页面密码进行保护没有问题) 。
您使用的是HTTP BASIC身份验证,而不是使用的HTTP 身份FORM验证j_security_check。该BASIC认证是通过完成Authorization从浏览器端请求报头,这是会话独立的。
BASIC
FORM
j_security_check
Authorization
要强制进行BASIC身份验证的“注销” ,服务器基本上需要返回401响应。
FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); externalContext.invalidateSession(); externalContext.responseSendError(401, "You are logged out."); facesContext.responseComplete();
这将提出一个HTTP 401错误页面,这是自定义为<error-page>在web.xml。
<error-page>
web.xml
您也可以返回带有元刷新的HTML页面,以便最终用户按照元刷新标题内容中指定的方向重定向到所需的目标页面。
FacesContext facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); externalContext.invalidateSession(); externalContext.setResponseStatus(401); externalContext.getResponseOutputWriter().write("<html><head><meta http-equiv='refresh' content='0;add_international_job.faces'></head></html>"); facesContext.responseComplete();
这似乎确实是很低级的,但是BASIC身份验证也很低级。使用FORM身份验证时,这不是必需的。仅使会话无效并发送正常重定向即可进行FORM身份验证。