嗨,我正在使用基本身份验证方法来保护Webapp中的某些页面。具有指定的网址格式,如下所示:
<url-pattern>/Important/*</url-pattern> <auth-method>BASIC</auth-method>
现在的问题是,如果用户使用登录表单以常规方式登录。数据将发布到我的servlet中,该servlet会验证用户名和密码,然后继续进行操作。有没有一种我可以在此servlet中设置setRemoteUser的方法,因为一旦用户尝试访问Important文件夹中的页面,身份验证输入就会再次出现。有没有一种方法可以通知身份验证机制用户已经登录?
这不可能。如果实际上有<form>用于登录的HTML ,则应将身份验证方法从更改BASIC为FORM。
<form>
BASIC
FORM
<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
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的未经身份验证的用户都将自动转发到登录页面。成功登录后,它将自动转发回最初请求的页面。
getRemoteUser()
另外,在FORMServlet 3.0兼容容器(Tomcat7,Glassfish3等)上使用身份验证方法时,您将能够通过Servlet中引入的Servlet3.0以编程方式登录用户HttpServletRequest#login()。这样可以对过程和验证进行更精细的控制。使用BASIC身份验证是不可能的。
HttpServletRequest#login()
该BASIC认证是一个完全不同的事情。它显示了一个带有用户名/密码输入的裸露JavaScript对话框。这不需要/使用HTML <form>或其他内容。它还将身份验证信息存储在客户端,该身份验证信息将作为每个后续请求中的请求标头发送。它不像身份验证一样在服务器端会话中存储身份验证信息FORM。