先介绍一下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" >
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>
<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>
<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
*/
<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.*;
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,尚未发现问题所在,些许遗憾~
{
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,尚未发现问题所在,些许遗憾~