登录页面错误

时间:2011-07-05 06:59:34

标签: java jsf login

这是我的登录页面

<h:outputText value="ENTER USERNAME" ></h:outputText>
<p:inputText value="#{treeBean.username}" id="user"></p:inputText>
<h:outputText value="ENTER PASSWORD" ></h:outputText>
<p:inputText value="#{treeBean.userpass}" id="pass"></p:inputText>
<p:commandButton value="GO"  action="#{treeBean.checkuser}" onclick="redirect()"></p:commandButton>
<script type="text/javascript">
function redirect()
{
window.location="/arcpage/arc.jsf";   
}
</script>

这是我的treeBean.checkuser函数

public void checkuser()
{
Connection con=null;
try
{
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "root");
try
{
st.executeUpdate("USE ARCPAGE");
String update="SELECT * FROM USER WHERE USER_NAME=? AND USER_PASS=?";
    PreparedStatement prest=con.prepareStatement(update);
    prest.setString(1,username);
    prest.setString(2,userpass);
ResultSet rs=prest.executeQuery();
if(rs.next()==false)
{
check="false";
}
else
{
check="true";
}
    }}}

这是我的主页:

<script type="text/javascript">
if(check!="true")
{
 window.location="/arcpage/login.jsf";   
}
</script>
<Main Page Content>

如果我输入正确的用户名 - 密码组合,我将被重定向到登录页面而不是主页面。如果我再次输入正确的组合,我将被重定向到主页面。即使我输入了错误的组合,第二次我被重定向到主页面。我认为首先执行主页面然后执行checkuser(),因此在显示主页面之前不会更新check的值。 为什么会这样?

1 个答案:

答案 0 :(得分:3)

那是因为您向执行重定向的onclick添加了一些JavaScript函数。当用户单击按钮时调用此方法。这反过来导致JSF操作被完全跳过。您似乎也认为JSF和JavaScript以某种方式同步运行。这是不真实的。它是两种完全不同的语言。 JSF仅在webserver中运行,生成HTML / CSS / JS代码并将其发送到webbrowser。 JS在webbrowser中运行,仅拦截HTML DOM树。

要解决此问题,只需删除 onclick并在JSF操作方法中执行导航。所以:

<p:commandButton value="GO"  action="#{treeBean.checkuser}" />

public String checkuser() {
    User user = userService.find(username, password);

    if (user == null) {
        return "login";
    } else {
        return "arc";
    }
}