1

这是我的登录页面的支持 bean。为什么调用logIn()方法后会保留值?我的意思是在我提交表单并返回登录页面后,我之前输入的用户名已经存在。我认为通过使用@RequestScoped注释不会保留值。

@Controller
@ManagedBean
@RequestScoped
public class LogInBean implements Serializable {

    private static final long serialVersionUID = 2092611147930386873L;

    @Autowired
    private UserService userService;
    private String username;
    private String password;
    private boolean rememberMe;

    public String logIn() {
        return "index?faces-redirect=true";
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isRememberMe() {
        return rememberMe;
    }

    public void setRememberMe(boolean rememberMe) {
        this.rememberMe = rememberMe;
    }

}
4

1 回答 1

1

这是因为您实际上使用的是应用程序范围的 Spring 托管 bean,而不是请求范围的 JSF 托管 bean。

您的主要错误是您将 JSF bean 管理注释与 Spring bean 管理注释混合在一起,并且以某种方式期望它们能够无缝地相互理解。

@Controller
@ManagedBean
@RequestScoped

因此这是不正确的。您实际上最终得到了两个完全独立的托管 bean 实例,一个由 JSF 管理,另一个由 Spring 管理。注释特定于@RequestScopedJSF bean 管理工具。Spring 的等效@Scope("request")项不存在,因此 Spring 托管 bean 默认为应用程序范围。当像这样在 EL 范围内引用 bean 时#{logInBean},由于 Spring bean EL 解析器,Spring 托管的优先于 JSF 托管的,您最终会得到一个应用程序范围的 Spring 托管 bean。这完全解释了症状。

通过摆脱 JSF bean 管理注释并放置所需的 Spring 范围注释来相应地修复它:

@Controller
@Scope("request")

(另一种方法是去掉 Spring bean 管理注释并替换@Autowired@EJB,就像在没有任何第三方库的情况下使用标准 Java EE 堆栈时通常所做的那样)

如果您仍然遇到此问题,那么另一个可能的原因是您在没有autocomplete="off"输入字段的情况下同步提交登录,然后前往此问答:禁用 Web 浏览器密码保存

于 2013-09-02T19:56:17.443 回答