登录页面和Servlet流程

时间:2012-06-25 20:31:20

标签: servlets login jdeveloper

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

所以有人制作了它,它抓取标题信息,然后检查以确保用户是数据库中的有效用户。如果是,则设置与该用户的会话。如果没有,它会指向注册页面。

我的问题在于理解调用此servlet的内容,是“调用此servlet所需的起始页面吗?”

2 个答案:

答案 0 :(得分:1)

  

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

您正在描述BASIC HTTP身份验证的工作方式。这是众所周知的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>

用户和角色的位置在servletcontainer本身中配置。这可以是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。自Servlet 3.0(Tomcat 7,Glassfish 3等)以来,这种方法是新的。请注意,这仍然需要<security-constraint>中的web.xml和容器中的领域。 Servlet也仅在您使用servlet filter而不是使用容器管理身份验证进行身份验证时使用。然后,在servlet中,您应该在会话中存储您自己的登录用户的数据库模型表示,如session.setAttribute("user", user)所示,以便过滤器可以拦截它。

另见:

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

答案 1 :(得分:0)

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

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

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

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