JSP - 安全性
JavaServer Pages 和 servlets 有几种可用的机制可以使 web 开发人员用来保护应用程序。资源可以通过在应用程序部署描述中对它们进行识别并且为它们分配一个角色来声明式地保护它们。
有几种级别的身份验证是可用的,从使用基本标示符的基本验证到复杂的使用证书的密码验证。
基本角色的验证
Servlet 规范中的认证机制使用的是一项被称为基于角色的安全技术。该想法是你通过角色来创建角色和限制资源,而不是限制用户级别的资源。
你可以定义在文件 tomcat-users.xml 中定义不同的角色,该文件位于 Tomcat 的主页目录中的 conf. 中。此文件的一个示例如下所示:
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="admin" password="secret" roles="admin,manager"/>
</tomcat-users>
这个文件在用户名称、密码和角色之间定义了一个简单的映射。请注意,一个给定的用户可能有多个角色,例如,在“tomcat”角色中的用户名=“both”,角色是“role1”。
一旦你识别和定义了不同的角色,一个基于角色的安全限制可以通过使用 
下面是 web.xml 中一个简单的示例:
<web-app>
...
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>
               SecuredBookSite
            </web-resource-name>
            <url-pattern>/secured/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>
            Let only managers use this app
            </description>
            <role-name>manager</role-name>
        </auth-constraint>
    </security-constraint>
    <security-role>
       <role-name>manager</role-name>
    </security-role>
    <login-config>
      <auth-method>BASIC</auth-method>
    </login-config>
...
</web-app>
以上条目将意味着:
- 
任何 通过 /secured/* 对一个 URL匹配 的HTTP GET 或者 POST 请求都将被安全限制所接受。
 - 
一个有着管理员角色的人是可以访问被保护的资源的。
 - 最后,login-config 元素是用来描述身份验证的 BASIC 形式。
 
现在,如果你试图浏览任何包含 /security 目录的 URL,它将显示一个询问用户名和密码的对话框。如果你提供一个用户“admin”和密码“secrer”,那么只有你可以通过 /secured/* 访问上面的 URL,因为我们已经定义了用户为管理员角色,而该角色是有权访问该资源的。
基于表单的身份验证
当时使用表单身份验证方法时,你必须提供一个登录表单来提示用户输入用户名和密码。下面是一个简单登录页面 login.jsp 的代码,用来创建一个相同目的的表单:
<html>
<body bgcolor="#ffffff">
   <form method="POST" action="j_security_check">
      <table border="0">
      <tr>
      <td>Login</td>
      <td><input type="text" name="j_username"></td>
      </tr>
      <tr>
      <td>Password</td>
      <td><input type="password" name="j_password"></td>
      </tr>
      </table>
      <input type="submit" value="Login!">
      </center>
   </form>
</body>
</html>
 
在这里,你必须确保登录表单中必须包含以 j_username 和 j_password 命名的表单元素。在