0

我试图了解登录用户所涉及的过程。我被告知需要创建一个 servlet 才能访问请求/响应的标头。

所以制作了一个,它获取标题信息,然后检查以确保用户是数据库中的有效用户。如果是这样,它会设置与该用户的会话。如果没有,它会转到注册页面。

我的问题是理解什么叫这个 servlet,是“调用这个 servlet 需要起始页吗?”

4

2 回答 2

1

...访问请求/响应的标头 ...获取标头信息 ...

您正在描述BASICHTTP 身份验证的工作方式。这是众所周知的 JavaScript 警报外观类似弹出窗口,它要求输入用户名和密码,并在提供不正确的凭据时导致 HTTP 401 Not Authorized 错误。这在 Java EE Web 应用程序中通常根本不由 servlet 执行,而是由特定的web.xml配置设置执行。它看起来像这样:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>secured</web-resource-name>
        <url-pattern>/secured/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>someRoleName</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

用户和角色的位置在 servlet 容器本身中配置。这可以是 XML 文件或数据库。您需要使用关键字“realm”参考 servletcontainer 特定文档如何配置它。例如,对于 Tomcat,它是Tomcat Realm HOWTO

另一种方法是FORM基于身份验证,但这不涉及您最初询问的通过请求标头传递登录信息。此外,通常根本不涉及 servlet,因为这是由容器的内置机制自动执行的。您只需将<login-config>上面的内容更改为下面的内容:

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
</login-config>

反过来login.jsp应该有一个 HTML 表单,它应该通过 POST 提交到一个预定义的 URL j_security_check,其中用户名和密码作为预定义的请求参数j_usernamej_password.

<form action="j_security_check" method="post">
    <input type="text" name="j_username" />
    <input type="password" name="j_password" />
    <input type="submit" value="login" />
</form>

这样做的好处是,您可以使用一些漂亮的 HTML/CSS/JS 以您想要的方式显示带有登录表单的页面,而不是显示一个类似 JavaScript 的简单对话框。

仅当通过调用request.login(username, password). 这种方法是自 Servlet 3.0(Tomcat 7、Glassfish 3 等)以来的新方法。请注意,这仍然需要容器中的<security-constraint>inweb.xml和 realm。Servlet 也仅在您使用servlet 过滤器而不是使用容器管理的身份验证进行家庭验证时使用。然后,在 servlet 中,您应该在会话中存储您自己的登录用户的数据库模型表示,session.setAttribute("user", user)以便过滤器可以拦截它。

也可以看看:

请注意,JDeveloper与这一切无关。它只是一个轻松开发 Java Web 应用程序的工具(IDE)。您可以在 Eclipse、Netbeans、IntelliJ 甚至记事本中做同样的事情。

于 2012-06-25T20:46:45.257 回答
0

它还取决于您要实现哪种安全性。您提到身份存储是 RDBMS(我假设的表),它允许您实现两种类型的身份验证:容器管理和自定义。在自定义身份验证(不太推荐)中,您向用户询问他/她的用户名/密码对,并将其与数据库中的用户进行比较。这里没有自动身份验证检查,需要一个 servlet 过滤器来确保用户在访问受保护的资源时得到身份验证。

容器管理 - 由上一个答案指示 - 允许您将身份验证委托给容器。在这种情况下,您编写的应用程序(您可能会对此更具体)不处理身份验证和身份验证跟踪本身,而只是 - 通过 web.xml 中的配置 - 将请求重定向到容器进行身份验证。

大多数应用程序服务器都允许您配置身份存储以对用户进行身份验证。对于 JDeveloper 中的默认设置 WebLogic 服务器,它可以是 LDAP、Active Directory、OID、WLS 和 SQL/Table 中的集成 LDAP。后者是一个预定义的身份验证提供程序(SQL 身份验证提供程序),它允许您配置 WLS 容器以根据数据库表对您的用户进行身份验证。

因此,我建议您使用 SQL 身份验证提供程序跟进容器管理身份验证,因为这意味着更少的工作

于 2012-06-26T09:09:48.803 回答