这是我的登录页面的支持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;
}
}
答案 0 :(得分:1)
这是因为你实际使用应用程序范围的Spring托管bean而不是请求范围的JSF托管bean。
您的主要错误是您正在将JSF bean管理注释与Spring bean管理注释混合在一起,并且不知何故期望它们能够无缝地相互理解。
@Controller
@ManagedBean
@RequestScoped
因此不是这样。您最终会有两个完全独立的托管bean实例,一个由JSF管理,另一个由Spring管理。 @RequestScoped
注释特定于JSF bean管理工具。 Spring的等价物@Scope("request")
不存在,因此Spring托管bean默认为应用程序范围。当像EL #{logInBean}
那样引用EL作用域中的bean时,由于Spring bean EL解析器,Spring管理的bean优先于JSF托管的bean,你最终得到了一个应用程序作用域的Spring托管bean。这完全解释了症状。
通过删除JSF bean管理注释并放置所需的Spring作用域注释来相应地修复它:
@Controller
@Scope("request")
(另一种方法是摆脱Spring bean管理注释并用@Autowired
替换@EJB
,就像在没有任何第三方库的情况下使用标准Java EE堆栈时一样)
如果仍然面临此问题,那么另一个可能的原因是您在输入字段中没有autocomplete="off"
的情况下同步提交登录信息,请转到此Q& A那么:Disable web browser password save。