【问题标题】:Old values in input fields by GET requestGET 请求输入字段中的旧值
【发布时间】: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.)跳转到页面的情况下,它才能正常工作。

怎么可能?

【问题讨论】:

  • 可能你的UserManager bean 的范围不正确。它是会话范围的吗?
  • 是的,它是会话范围的。我应该是,不是吗?
  • 如果你把它设为@SessionScoped,它就位于当前的HTTP Session上,这使得它依赖于your current HTTP Session tracking metodology。只需将其更改为@ViewScoped@RequestScoped,具体取决于您是否要保留视图状态。
  • 会不会是浏览器只存储了这些值,因为你保存了它们?
  • 只是浏览器的问题?当您进入应用程序时,您必须选择不记住您当前的凭据...

标签: forms jsf


【解决方案1】:

JSF 不这样做(作为证据,请查看生成的 HTML 输出)。网络浏览器就是这样做的。此功能称为“自动填充”/“自动完成”。只需通过将autocomplete="off" 添加到各个输入组件来告诉它不要这样做。

<h:inputText ... autocomplete="off" />
<h:inputSecret ... autocomplete="off" />

或者,如果您使用的是 JSF 2.2(或使用 OmniFaces Html5RenderKit),您也可以在表单范围内设置它。

<h:form ... autocomplete="off">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-26
    • 2023-04-08
    • 2018-01-07
    • 2021-07-02
    • 2021-09-30
    • 1970-01-01
    • 2018-05-02
    • 2018-06-15
    相关资源
    最近更新 更多