简体   繁体   English

如何从jsp到servlet获取值并进行mysql查询

[英]How to obtain value from jsp to servlet and make mysql query

I have login form in index.jsp and login servlet . 我在index.jsplogin servlet有登录表单。 Depend on privileges if the username and password are correct one of the three .jsp pages are opened ( admin.jsp, user1.jsp, user2.jsp ). 如果用户名和密码正确,则取决于特权,这将打开三个.jsp页面( admin.jsp, user1.jsp, user2.jsp )之一。 In opened .jsp page username of user is showed (${User.username}) . 在打开的.jsp页面中,显示用户的用户名(${User.username}) I also have bean "User" which stores user data. 我也有存储用户数据的bean“ User”。

Login servlet 登录servlet

public class Login extends HttpServlet {
 @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    User user = new User();
    user.setUsername(username);
    user.setPassword(password);

    try {
        HttpSession session = request.getSession(true);
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","");
        Statement stm = conn.createStatement();
        if( !(username.equals("")) && !(password.equals("")) ){
          String query = "SELECT * FROM users WHERE username='"+username+"' AND password='"+password+"'";
          ResultSet res = stm.executeQuery(upit);
          if(res.next()){
              String username = res.getString(2);
              int privileges = res.getInt(9);
              int active = res.getInt(10);
              user.setUsername(username);
              user.setPrivileges(privileges);
              user.setActive(active);

              sesija.setAttribute("user", user);
              if(privileges==1 && active==1){
                    RequestDispatcher r = request.getRequestDispatcher("/admin.jsp");
                    r.forward(request, response);
              }
              ......rest of the code

    }catch(Exception e){
    out.println(e);}
}

In admin.jsp I have line: admin.jsp中,我有一行:

<div id="topMenu>${user.username} | <a href="Logout">Logout</a></div>

Bean "User" Bean“用户”

public class User {

private String username;
private int privileges;
private int active;



public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public int getPrivileges() {
    return privileges;
}
public void setPrivileges(int privileges) {
    this.privileges = privileges;
}

 public int getActive() {
    return active;
}
public void setActive(int active) {
    this.active = active;
}


}

User has possibility of searching for products in database in accordance with his privileges. 用户可以根据自己的权限在数据库中搜索产品。 After he clicks on the search button I want to retrieve his username and to use for making database query in new servlet. 在他单击搜索按钮后,我想检索他的用户名并用于在新servlet中进行数据库查询。 When I put manually username of user in servlet code (in sql query statement) for purpose of code checking, everything works fine and result is generated, but I have problem to obtain value automatically when user hits search button. 当我出于代码检查目的将用户的用户名手动放入servlet代码(在sql查询语句中)时,一切正常,并生成了结果,但是当用户点击搜索按钮时,我无法自动获取值。

Thanks in advance 提前致谢

You should simply store the user name (or rather, its unique ID), in the HTTP session once it's authenticated. 一旦通过身份验证,您应该只在HTTP会话中存储用户名(或更确切地说,其唯一ID)。 That way, for every request coming to the server, you know which user is sending it: 这样,对于到达服务器的每个请求,您都知道哪个用户正在发送该请求:

if (res.next()) {
    String username = res.getString(2);
    request.getSession().setAttribute("authenticatedUserName", username);

And every time you need to get the current authenticated user: 并且每次您需要获得当前经过身份验证的用户时:

String authenticatedUserName = 
    (String) request.getSession().getAttribute("authenticatedUserName");

Side note: learn to use prepared statements . 旁注:学会使用准备好的陈述 Your code is vulerable to SQL injection attacks, and will break as soon as a user has a single quote in its name or password. 您的代码很容易受到SQL注入攻击的攻击,并且一旦用户在名称或密码中使用单引号,该代码便会中断。 Also, don't use an int when what you really want is a boolean (active, for example, should be a boolean). 另外,当您真正想要的是布尔值时(例如,应为布尔值),请勿使用int值。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM