如何使用servlet对用户进行身份验证

Jam*_*mes 2 authentication servlets login java-ee web

我是Java EE的新手.我创建了一个登录表单和servlet来验证用户的凭据,但是当我getRemoteUser()在验证后用方法检查远程用户时,我的代码不显示用户名.

我的登录servlet是:

String uname,pass;
PreparedStatement ps=null;
uname=request.getParameter("uname");
pass=request.getParameter("pass");

ResultSet rs = null;
Connection con = null;
try {
    con = prepareConnection();

    String Query="select uname,email from passmanager where pass=?";
    ps=con.prepareStatement(Query);

    ps.setString(1,pass);
    rs=ps.executeQuery();

    while(rs.next())
    {
        if (uname.equals(rs.getString("uname")) || uname.equals(rs.getString("email"))) 
        {
            rs.close();                                                              
            ps.close();                                                            
            ps = null;                                                             
            con.close();                                                            
            con = null;  
            HttpSession session = request.getSession(true); 
            session.setAttribute("currentSessionUser",uname); 
            RequestDispatcher dis = request.getRequestDispatcher("/user.html");
            dis.forward(request, response);
            break;
        }
    }
}
catch(Exception e)
{
    System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)

如果有任何需要更改/修改,请告诉我并帮助我.....提前感谢.

Bal*_*usC 8

HttpServletRequest#getRemoteUser()容器管理身份验证的一部分,它基本上只是一个简单的<security-constraint>XML配置条目web.xml.

但是你有一个完全自制的servlet,它实际上也做了很糟糕的数据库交互(它通过WHERE用户名和密码上的子句在Java中而不是在SQL中进行比较;此外它还会泄漏JDBC资源没有关闭它们finally).

你基本上有两个选择:

  1. 不要在家里进行身份验证.删除所有错误,低效和资源泄漏的代码并使用容器管理的身份验证.您可以在此答案中找到启动示例:仅限制对特定用户的JSP/Servlet访问

  2. 只需通过session.getAttribute("currentSessionUser")和/或${currentSessionUser}代替获取登录用户,然后生成servlet过滤器以进行访问限制.您可以在此答案中找到启动示例:使用Java中的过滤器验证用户名,密码(与数据库联系)

  • 公平地说,他只使用相同的密码加载用户。我主要关心的是密码以明文形式存储在数据库中。这将使用户面临风险,而不是应用程序的健康。 (2认同)