我正在尝试了解登录用户所涉及的过程。我被告知需要制作一个servlet才能访问请求/响应的标头。
所以有人制作了它,它抓取标题信息,然后检查以确保用户是数据库中的有效用户。如果是,则设置与该用户的会话。如果没有,它会指向注册页面。
我的问题在于理解调用此servlet的内容,是“调用此servlet所需的起始页面吗?”
答案 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_username
和j_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身份验证提供程序跟进容器管理身份验证,因为这意味着更少的工作