2014-09-05 20 views
0

发生了一个非常奇怪的问题: 在Tomcat 7.0服务器上第一次启动我的JSF项目时,用户名的验证器不工作。如果我重新加载项目,一切突然就像魅力一样。奇怪的是,registerUser方法总是工作。验证器在第一次启动服务器时不起作用,在项目重新加载后工作

这里是我的代码片段:

 <h:outputLabel value="Username:" for="username"></h:outputLabel> 
     <h:inputText id="username" value="#{register.name}" validator="# {register.validateName}" validatorMessage="Suggestion: Try another name"> 
     <h:message for="username"></h:message></h:inputText> 

下一页我register.java豆:

package fileserver; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

import javax.faces.application.FacesMessage; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.validator.ValidatorException; 


@ManagedBean 
@SessionScoped 
public class Register { 

public String name; 
public String passWord; 
public String queryString; 

public String getName() { 
    return name; 
} 


public void setName(String name) { 
    this.name = name; 
} 


public String getPassWord() { 
    return passWord; 
} 


public void setPassWord(String passWord) { 
    this.passWord = passWord; 
} 


public String registerUser() throws SQLException{ 


     try { 
      Class.forName("org.postgresql.Driver"); 
     } catch (ClassNotFoundException e1) { 
      System.out.println("Damn"); 
      e1.printStackTrace(); 
     } 
     Connection connection = null; 

     try { 
     connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/JavaServerFaces", "postgres", 
     "123456"); 
     System.out.println("Connection success"); 
     } catch (SQLException e) { 
     System.out.println("Connection Failed! Check output console"); 
     e.printStackTrace(); 
     return null; 

     } 

    queryString= "INSERT INTO tbl_benutzer" 
       + "(username, password)" 
     + "VALUES ('"+ name+"', '"+ passWord+"')"; 
     Statement sql = connection.createStatement(); 

     if (connection != null) { 
     sql.execute(queryString); 
     System.out.println("Successfully added:VALUES ('"+name+"', '"+ passWord+"')"); 
     sql.close(); 
     connection.close(); 
     return "/index.xhtml"; 
     } 
     //is here because the method requires a return value 
     return null; 
     } 


public void validateName(FacesContext context, UIComponent component, Object value) 
     throws ValidatorException, SQLException { 
    System.out.println(context.toString()); 
    queryString = "SELECT username FROM tbl_benutzer WHERE username='"+ name +"'"; 

    try { 
     Class.forName("org.postgresql.Driver"); 
    } catch (ClassNotFoundException e1) { 
     System.out.println("Shit"); 
     e1.printStackTrace(); 
    } 
    Connection connection = null; 

    try { 
    connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/JavaServerFaces", "postgres", 
    "123456"); 
    System.out.println("Connection success"); 
    } catch (SQLException e) { 
    System.out.println("Connection Failed! Check output console"); 
    e.printStackTrace(); 
    } 
    Statement names=connection.createStatement(); 
    ResultSet Nameset=names.executeQuery(queryString); 

    if(Nameset.next()){ 
     FacesMessage message = new FacesMessage(); 
     message.setSeverity(FacesMessage.SEVERITY_ERROR); 
     message.setSummary("Name is already used."); 
     message.setDetail("Name is already used."); 
     context.addMessage("userForm:register", message); 
     throw new ValidatorException(message); 

    } 

}  
} 

经过一番研究,我发现,这串名字是在验证空一些未知的原因并且我无法获取它,即使我直接在此方法中调用getName()。 有没有人有解决方案?

+0

'validator =“#{register.validateName}”'从您的代码中确切复制了一份副本吗?在'#'和'{'之间加上空格?在这个代码中,有一个严重的SQL注入漏洞。 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html – BalusC 2014-09-05 14:37:25

+0

这只是大学的一个项目。主要关注的是服务器,而不是数据库,我知道这个漏洞,但我访问数据库的方式并不那么重要。此外,#和{之间的空白是一个复制/粘贴错误 – CookieMadness 2014-09-05 16:06:04

+0

另外我只是发现主要问题似乎是名称为null时,验证程序被调用。在验证者被调用的时候,似乎有一个问题。我能以某种方式延迟这一点吗? – CookieMadness 2014-09-05 16:26:44

回答

1

忽略SQL注入孔和许多(!!)等设计错误,以下是有缺陷的:

public void validateName(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException { 
    queryString = "SELECT username FROM tbl_benutzer WHERE username='"+ name +"'"; 
    // ... 

你不是与提交的值可作为第三个参数value工作。您直接使用模型值name,而在验证程序被调用时尚未更新。基本上,你正在使用初始值而不是提交的值。这也解释了为什么它在第二次提交表单后才“有效”。

修复它的相应:

public void validateName(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException { 
    queryString = "SELECT username FROM tbl_benutzer WHERE username='"+ value +"'"; 
    // ... 

再次,有在代码中太多的设计错误。我真的希望你的导师知道他在做什么。

+0

非常感谢。在我读完这篇文章之后,我马上面面相觑。按我现在想要的完美工作。 Stuuuuuupup错误由我。我相信我的导师知道他在做什么,但他通常喜欢在完全干净的代码上使用代码。此外,我不是最有才华的程序员(其实我很惊讶我没有寻求帮助而得到了这么多)。无论如何,再次感谢:) – CookieMadness 2014-09-05 16:51:26

相关问题