先看下项目构造(我用Maven管理的依赖):

个中,protect/protect.jsp是被保护的,须要授权访问。

解释:本文提到的tomcat-users.xml,server.xml等文件,如果是在Eclipse中启动tomcat,则这些文件在Eclipse中的Servers工程下对应的tomcat下,如图:

Tomcat校验JSP页面的包Tomcat容器治理平安的几种验证方法 GraphQL

而本文提到的web.xml是指项目自己的web.xml,而非Servers项眼前Tomcat中的web.xml。

web.xml

tomcat-user.xml(把稳如果是在Eclipse中启动tomcat,这个tomcat-user.xml在Eclipse中的Servers工程下)

重启tomcat后,访问protect目录下的资源,情形是这样的:

输入账户alvis,密码pwd后,访问成功(当然,非protect目录下的资源是可以直接访问的):

择要验证

当web.xml文件中的auth-method元素设置为DIGEST时,表明运用利用的是择要验证。
还是上面的例子,看配置:

web.xml和基本验证一样,只是auth-method修正为DIGEST,此处不赘述。

server.xml中的UserDatabaseRealm(如果tomcat利用的是其他Realm,也一样的)里增加digest属性:

接下来,要天生tomcat可识别的MD5密码。
办法有两种,正如官网描述:

To calculate the digested value of a cleartext password, two convenience techniques are supported:

If you are writing an application that needs to calculate digested passwords dynamically, call the static Digest()method of the org.apache.catalina.realm.RealmBase class, passing the cleartext password and the digest algorithm name as arguments. This method will return the digested password.If you want to execute a command line utility to calculate the digested password, simply execute

CATALINA_HOME/bin/digest.[bat|sh] -a {algorithm} {cleartext-password}and the digested version of this cleartext password will be returned to standard output.

办法一:用代码来天生:

由于RealmBase类在catalina.jar包中,如果项目中没有这个类,可在项目上右键-->Java Build Path--> Libraries-->Add Library-->选择Server Runtime-->选择Apache Tomcat V8.0(实在7.0也行),如图:

办法二:用脚本来天生:

在tomcat/bin目录下有个digest.sh(Linux系统)或digest.bat(Windows系统)脚本,运行这个脚本,传入择要算法和参数即可,这里我在Windows系统上运行,如图:

这里的-a指定择要算法为MD5,要特殊把稳这里的参数是:{用户名}:{Realm名}:{密码明文}。
用户名便是tomcat-users.xml中配置的<user>名字(这里为alvis),Realm名是在web.xml中配置的<realm-name>(这里为MyConstraints),密码明文即该用户用于登录的密码(我这里设为pwd)。

只有这样的参数加密后的密码,在tomcat-users.xml中配置才有效,否则是登录不了的。
由于我是参考《Tomcat威信指南(第二版)》的步骤做的,之前试了良久都不知道为什么登录不了,结果在官网找到答案,是这么描述的:

If using digested passwords with DIGEST authentication, the cleartext used to generate the digest is different and the digest must use the MD5 algorithm. In the examples above {cleartext-password} must be replaced with {username}:{realm}:{cleartext-password}. For example, in a development environment this might take the form testUser:Authentication required:testPassword. The value for {realm} is taken from the <realm-name> element of the web application's <login-config>. If not specified in web.xml, the default value of Authentication required is used.

大意是说,如果利用DIGEST办法验证,用于天生择要的明文必须被更换为这种格式。
实践出真知,以是还是不能完备看书啊,动手实践才是实在的。

然后便是在tomcat-users.xml中配置天生的密码(通过下方的截图,可以比较password跟上方digest.bat脚本天生的密码是否同等):

之后重启tomcat,效果自然是跟利用基本验证的效果一样了。

表单验证

当web.xml文件中的auth-method元素设置为FORM时,表明运用利用的是表单验证。
当用户要求Web运用程序受保护的资源时,表单验证会跳转至配置的登录页面。
当登录失落败时,还须要一个验证失落败的页面,还是上面的例子,看配置:

web.xml

这里的form/login.html是用于登录的页面,而form/error.html则是验证失落败后跳转到的页面(这两个页面在上方的工程构造图中已经有了)。

login.html

把稳:这里form的action=\"大众j_security_check\公众,账号的name=\"大众j_username\公众和密码的name=\"大众j_password\"大众都是不可变的,否则配置的验证规则不起浸染。

server.xml中,要去掉Realm中添加的“digest=MD5”这个属性:

tomcat-users.xml中利用明文保存密码:

效果(仅在访问protect目录下的资源时才涌现Login Page):

输入缺点的账号和密码,跳转至form/error.html页面:

输入精确的账号和密码,跳转至受保护的页面:

Demo下载:

链接:https://pan.baidu.com/s/1vi6CxRbQUM1Vq-K9OmIBxA

提取码:iqwm