我正在尝试使用 JSF 2.0 实现“记住我”功能,但不确定如何实现 COOKIES 来做到这一点。您能分享一个有效的示例代码吗?
最佳答案
编辑:不要在 cookie 中存储密码或用户名!
See this post by BalusC for a better implementation.
我相信这可能对您有帮助:
login.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<h:body>
<h:form id="LoginForm">
<h:panelGrid id="lpg" columns="4" >
<h:outputText value="User Id"/>
<h:inputText id="username" value="#{loginBean.userId}"/>
<h:outputText value=""/>
<h:outputText value="Password"/>
<h:inputSecret id="password" value="#{loginBean.password}"/>
<h:outputText value=""/>
<h:outputText value=""/>
<h:outputText value=""/>
<h:outputText value=""/>
<h:outputText value=""/>
<h:selectBooleanCheckbox value="#{loginBean.checkBox}" />
<h:outputText value="Remember me" />
<h:outputText value=""/>
<h:outputText value=""/>
<h:commandButton value="Login" action="#{loginBean.doLogin}"/>
</h:form>
</h:body>
</html>
LoginBean.java
public class LoginBean {
private String userId;
private String password;
private boolean checkBox = false;
private String virtualCheck;
// Setter and getter
public LoginBean() {
isChecked();
}
public void isChecked() {
FacesContext fc = FacesContext.getCurrentInstance();
Cookie[] cookiesArr = ((HttpServletRequest)(fc.getExternalContext().getRequest())).getCookies();
if(cookiesArr != null && cookiesArr.length > 0)
for(int i =0; i < cookiesArr.length; i++) {
String cName = cookiesArr[i].getName();
String cValue= cookiesArr[i].getValue();
System.out.println("***cValue***"+cValue);
if(cName.equals("cUserId")) {
setUserId(cValue);
} else if(cName.equals("cPassword")) {
setPassword(cValue);
} else if(cName.equals("cVirtualCheck")) {
setVirtualCheck(cValue);
if(getVirtualCheck().equals("false")) {
setCheckBox(false);
setUserId(null);
setPassword(null);
} else if(getVirtualCheck().equals("true")) {
System.out.println("Here in doLogin() line 99");
setCheckBox(true);
}
}
}
}
public String doLogin() {
if(userId != null && password!= null){
FacesContext fc = FacesContext.getCurrentInstance();
if(checkBox == true) {
virtualCheck = "true";
Cookie cUserId = new Cookie("cUserId", userId);
Cookie cPassword = new Cookie("cPassword", password);
Cookie cVirtualCheck = new Cookie("cVirtualCheck", virtualCheck);
cUserId.setMaxAge(3600);
cPassword.setMaxAge(3600);
cVirtualCheck.setMaxAge(3600);
((HttpServletResponse)(fc.getExternalContext().getResponse())).addCookie(cUserId);
((HttpServletResponse)(fc.getExternalContext().getResponse())).addCookie(cPassword);
((HttpServletResponse)(fc.getExternalContext().getResponse())).addCookie(cVirtualCheck);
} else {
virtualCheck = "false";
Cookie cVirtualCheck = new Cookie("cVirtualCheck", virtualCheck);
((HttpServletResponse)(fc.getExternalContext().getResponse())).addCookie(cVirtualCheck);
}
return "success";
}
注意为了保存密码,浏览器将提示是否保存密码,无论 Java Web 技术如何,浏览器设置和检索 cookie 将发挥主要作用。
关于jsf-2 - 使用 cookie 的“记住我”功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034714/