【发布时间】:2013-09-01 15:00:45
【问题描述】:
我在 loginform.xhtml 文件中有这个 JSF 表单:
<h:form>
<h:panelGrid columns="3" styleClass="components" cellpadding="5px">
<h:outputText value="#{msg['login.username']}"/>
<h:inputText id="username" value="#{userManager.loginUser.username}" required="true"/>
<h:message styleClass="error" for="username"/>
<h:outputText value="#{msg['login.password']}"/>
<h:inputSecret id="password" value="#{userManager.loginUser.password}"
required="true"/>
<h:message styleClass="error" for="password"/>
<h:commandButton value="#{msg['login.confirm']}"
action="#{userManager.doLogin}"/>
</h:panelGrid>
</h:form>
有了这个 ManagedBean:
public class UserManager implements Serializable {
/**
* Creates a new instance of UserManager
*/
public UserManager() {
}
private UserRecord loginUser = new UserRecord();
private UserRecord sessionUser;
@EJB
private UserRecordFacadeLocal userRecordFacade;
public UserRecord getLoginUser() {
return loginUser;
}
public void setLoginUser(UserRecord loginUser) {
this.loginUser = loginUser;
}
public UserRecord getSessionUser() {
return sessionUser;
}
public void setSessionUser(UserRecord sessionUser) {
this.sessionUser = sessionUser;
}
public String doLogout() {
setSessionUser(null);
return "logout";
}
public String doLogin() {
if (userRecordFacade.authorizedAcces(loginUser.getUsername(), loginUser.getPassword())) {
setSessionUser(loginUser);
return "success";
}
return "failure";
}
}
这是我的问题:如果我向 loginform.xhtml 输入一个 GET 请求(在我的例子中:http://localhost:8080/Impetus-web/loginform.xhtml),表单将由旧值填充!更正确的值 - 这对系统的安全性非常不利:-)。如果我通过 h:link 标签导航到此页面,也会发生同样的情况。只有在我通过 POST 请求(通过 commandButton f. e.)跳转到页面的情况下,它才能正常工作。
怎么可能?
【问题讨论】:
-
可能你的
UserManagerbean 的范围不正确。它是会话范围的吗? -
是的,它是会话范围的。我应该是,不是吗?
-
如果你把它设为
@SessionScoped,它就位于当前的HTTP Session上,这使得它依赖于your current HTTP Session tracking metodology。只需将其更改为@ViewScoped或@RequestScoped,具体取决于您是否要保留视图状态。 -
会不会是浏览器只存储了这些值,因为你保存了它们?
-
只是浏览器的问题?当您进入应用程序时,您必须选择不记住您当前的凭据...