2

我是 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);
}

如果有任何需要更改/修改的内容,请告诉我并帮助我.....提前致谢。

4

3 回答 3

8

它是容器管理身份验证的HttpServletRequest#getRemoteUser()一部分基本上<security-constraint>只是web.xml.

但是你有一个完全自制的 servlet,它实际上在 DB 交互方面也做得很差(它在 Java 中而不是在 SQL 中通过WHERE用户名和密码的子句执行比较;此外,它还通过以下方式泄漏 JDBC 资源不关闭它们finally)。

你基本上有两个选择:

  1. 不要自产身份验证。删除所有糟糕、低效和资源泄漏的代码,并使用容器管理的身份验证。您可以在此答案中找到一个启动示例:Restrict JSP/Servlet access to specific users only

  2. session.getAttribute("currentSessionUser")只需通过和/或获取登录用户,${currentSessionUser}然后自制一个 servlet 过滤器来限制访问。您可以在此答案中找到一个启动示例:Authenticating the username, password by using filters in Java (contacting with database)

于 2013-02-04T12:43:01.890 回答
2

要添加到@BalusC 的响应,还有另一种容器管理身份验证方法,使用Java Servlet 3.0Java EE 6的一部分)中的javax.servlet.http.HttpServletRequest中的安全方法-和. 它们是 HttpServletRequest 对象中的新方法,而且几乎没有引起注意(如果通过这些简化花费了这么多时间来获得这个 Java EE 版本,为什么会有不同呢?)。loginlogoutauthenticate

无论采用哪种方法(编程式或声明式),您最终都必须在应用程序服务器中配置用户存储库(该部分是特定于容器的),并可能定义一个领域以指向部署描述符中的用户存储库web.xml(默认情况下可能不适合您的需要 -BASICFORM) CLIENT_CERT

在您的情况下,servlet 做的太多 - 负责检索用户的部分应该是应用程序服务器的自定义用户注册表处理程序的一部分(或者更好的是 - 重用应用程序服务器中已经可用的内容 - WebSphere V8.5 Liberty ProfileWebSphere V8.5 ) 并且一旦它被定义用于<security-constraint>web.xml以上新的安全方法。

于 2013-02-05T13:07:25.963 回答
0

您没有以这种方式记录您的用户。您所做的是设置一个名为“currentSessionUser”的会话属性,并且容器没有将其识别为“经过身份验证的用户”。

搜索“领域配置(您的容器名称)”以查看如何进行此配置。每个容器都有自己的方式来做到这一点。:)

于 2013-02-04T12:43:01.423 回答