3

嗨,我正在使用基本身份验证方法来保护我的 Webapp 中的某些页面。其中有一个指定的 url 模式,如下所示:

<url-pattern>/Important/*</url-pattern>
<auth-method>BASIC</auth-method>

现在的问题是,如果用户使用登录表单以正常方式登录。数据将发布到我的 servlet,该 servlet 验证用户名和密码,然后继续进行。有没有办法我可以在这个 servlet 中设置远程用户,因为一旦用户尝试访问重要文件夹中的页面,身份验证输入就会再次出现。有没有一种方法可以通知用户已经登录的身份验证机制?

4

2 回答 2

3

这是不可能的。如果您实际上有一个<form>用于登录的 HTML,那么您应该将身份验证方法从 更改BASICFORM

<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>

您还需要确保您的 HTML<form>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>

这样,容器将以您需要的方式设置登录名,并且用户名将由getRemoteUser(). 此外,任何直接访问受限 URL 的未经身份验证的用户都将被自动转发到登录页面。成功登录后,它会自动转发回最初请求的页面。

此外,FORM在与 Servlet 3.0 兼容的容器(Tomcat 7、Glassfish 3 等)上使用身份验证方法时,您将能够通过 Servlet 3.0HttpServletRequest#login()在 servlet 中引入的方法以编程方式登录用户。这允许对过程和验证进行更细粒度的控制。这对于身份验证是不可能的BASIC

BASIC身份验证是完全不同的事情。它显示了一个带有用户名/密码输入的纯 JavaScript 外观对话框。这不需要/使用 HTML<form>或其他东西。它还将身份验证信息存储在客户端,这些信息在每个后续请求中作为请求标头发送。它不会像FORM身份验证那样将身份验证信息存储在服务器端会话中。

也可以看看:

于 2012-06-27T12:36:18.233 回答
0

如果用户尚未登录,该方法 HttpServletRequest.getRemoteUser() 将返回。null

这适用于所有类型的身份验证。

以下是 API 文档所说的:

java.lang.String getRemoteUser()

Returns the login of the user making this request, if the user has been 
authenticated, or null if the user has not been authenticated. Whether the user 
name is sent with each subsequent request depends on the browser and type of      
authentication. Same as the value of the CGI variable REMOTE_USER.

Returns:
    a String specifying the login of the user making this request, 
   or null if the user login is not known
于 2012-06-27T11:56:57.830 回答