基本认证和摘要认证都只能使用浏览器自带的登录框而不能使用自定义的登录页面。如果必须使用自定义的登录页面,则可以选择基于表框的认证方式。
基于表框的认证的配置与基本认证和摘要认证的差别在于部署描述符中 <login-config/> 元素的设置不同:
<login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login.html</form-login-page> <form-error-page>/login.html</form-error-page> </form-login-config> </login-config>
基于表单的认证方式需将 auth-method 置为 FORM 同时配置 form-login-config 元素。form-login-config 元素有两个子元素:form-login-page 元素与 form-error-page 元素。当访问受保护的资源时,如果用户还未认证,servlet 容器则发出 form-login-page 指定的页面。如果验证失败的话,servlet 容器发出 form-error-page 指定的元素。可以将 form-login-page 与 form-error-page 同时都指定为登录页面,这样当验证错误时用户可以继续输入用户名和密码。
下面是一个简单的登录页面 login.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Login</title> </head> <body> <h1>Login Form</h1> <form action="j_security_check" method="post"> <div> User Name: <input name="j_username"/> </div> <div> Password: <input name="j_password" type="password" /> </div> <div> <input type="submit" value="Login" /> </div> <form> </body> </html>
当在浏览器键入受保护的资源时,servlet 容器发送指定的登录页面:
如果输入正确的用户名和密码时,则可以访问到受保护的资源。可以使用 HttpServletRequest.getUserPrincipal 获取包含用户登录信息的 java.security.Principal 对象。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <html> <head> <title>Photo</title> </head> <body> Hello, ${ pageContext.request.userPrincipal.name }! </body> </html>
成功登录后,访问受保护的资源: