一尘不染

基本身份验证:是否可以像getRemoteUser()一样设置setRemoteUser

jsp

嗨,我正在使用基本身份验证方法来保护Webapp中的某些页面。具有指定的网址格式,如下所示:

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

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


阅读 452

收藏
2020-06-08

共1个答案

一尘不染

这不可能。如果实际上有<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>提交到预定义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>

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

另外,在FORMServlet 3.0兼容容器(Tomcat7,Glassfish3等)上使用身份验证方法时,您将能够通过Servlet中引入的Servlet3.0以编程方式登录用户HttpServletRequest#login()。这样可以对过程和验证进行更精细的控制。使用BASIC身份验证是不可能的。

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

2020-06-08