Tomcat服务器Web安全应用程序

 先介绍一下Tomcat,Tomcat服务器是一个免费的开源Web应用服务器,它是Apache软件基金会的Jakarta项目中的一个核心项目,由Apache、Sun和爱他一些公司及个人共同开发。
        Servlet认证机制有4种:HTTP基本认证、摘要认证、客户端认证、表单认证。在这里分享和记录个人学习表单认证的实例和学习笔记:
        首先 要在部署描述符中描述所有的安全策略,总结起来应该包括安全声明、认证机制、角色声明。具体web.xml部署描述符代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app 
xmlns="http://java.sun.com/xml/ns/j2ee
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4" > 
  <display-name>root</display-name>
  <servlet>
   <servlet-name>SecureServlet</servlet-name>
   <servlet-class>chapter09.SecureServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>SecureServlet</servlet-name>
   <url-pattern>/secure</url-pattern>
  </servlet-mapping>
 
    <security-constraint>     <!--  安全声明  -->
   <web-resource-collection><!--  用于指定安全约束的资源集合  -->
    <web-resource-name>declarative security test</web-resource-name>
     <url-pattern>/secure</url-pattern>
     <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint><!--  用于指定访问web-resource-collection元素中指定资源的角色  -->
     <role-name>supervisor</role-name>
    </auth-constraint>
    <user-data-constraint><!--  用于指定数据如何在服务器和客户端间进行通信 -->
     <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
  </security-constraint>
   
  <login-config>            <!--  认证机制  -->
    <auth-method>FORM</auth-method>          <!--  表单认证  -->
    <form-login-config>
     <form-login-page>/formlogin.html</form-login-page>
     <form-error-page>/formerror.html</form-error-page>
    </form-login-config>
  </login-config> 
  
  <security-role>           <!--  角色声明  -->
   <role-name>supervisor</role-name>
  </security-role>
  
</web-app> 

         其次,完成部署描述符中<servlet-name>元素中指定的Servlet。我的感觉是这个程序相当于整个服务器的入口,客户端访问服务器的直接反馈。在Servlet代码中是没有任何和安全相关存在,所有的安全均有容器通过部署描述符中相关信息管理:
/* 
 * file name: SecureServlet.java
 * function: certificate
 * author: han you-han
 * date: 2012.12.01
 * version: v1.0
*/
package chapter09;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class SecureServlet extends HttpServlet
{
   public void doGet (HttpServletRequest req, HttpServletResponse res) throws IOException
   {
      PrintWriter pw = res.getWriter();
      pw.println("<html><head>");
      pw.println("<title>Declarative Security Example</title>");
      pw.println("</head>");
      pw.println("<body>");
      pw.println("Hello! HTTP GET request is open to all users.");
      pw.println("</body><html>");
   }
      
   public void doPost (HttpServletRequest req, HttpServletResponse res) throws IOException
   {
      PrintWriter pw = res.getWriter();
      pw.println("<html><head>");
      pw.println("<title>Declarative Security Example</title>");
      pw.println("</head>");
      pw.println("<body>");   
      String name = req.getParameter("username");
      pw.println("Welcome, "+name+"!");
      pw.println("<br>You are seeing this page because you are a supervisor.");
      pw.println("</head></html>");    
   } 


      如果在浏览器中键入http://localhost:8080:/chapter09/secure地址,请求是一个GET,不需要安全验证;如果在浏览器中输入 http://localhost:8080:/chapter09/posttest.html地址,HTML文件中包含一个POST请求,将发送一个POST请求给Servlet引擎。转到formlogin.html。formlogin.html代码如下:
<html>
 <body>
  <h4>Please login:</h4>
  <form  action="j_security_check" method="POST">
   Name: <input type="text" name="j_username">
   Password: <input type="password" name="j_password">
   <input type="submit" value="OK">
  </form>
 </body>
</html>
       
       其中posttest.html代码如下:
<html>
 <body>
  <form action="/chapter09/secure" method="POST">
   Name: <input type="text" name="username">
   <input type="submit">
  </form>
 </body>
</html> 

     其中 formerror.html代码如下:
<html>
 <head>
  <title>You are the failure!</title>
 </head>
 <body>
  <br>Sorry! Han<br>
 </body>
</html>

    整个文件的工程结构必须严格按照Tomcat规定安置。只有当用户提供了正确的用户名和密码后,才能通过安全验证,Servlet的doPost方法才能得到执行。合法的用户名和密码应该在tomcat-users.xml中定义 ,如果用户提供了错误的用户名密码,则页面转发到一个错误页面,即formerror.html。通过调试,在我电脑上依然存在一些小Bug,就是第一次正确输入用户名密码后依然要执行一次doGet(),而后才能正常显现doPost,尚未发现问题所在,些许遗憾~
阅读更多

没有更多推荐了,返回首页