会话跟踪技术例子——隐藏表单域

来源:互联网 发布:网络捕鱼游戏技巧大全 编辑:程序博客网 时间:2024/06/07 09:38

在我的上一篇文章里面已经介绍了实现会话跟踪的几种方式http://blog.csdn.net/lvpin/archive/2007/06/09/1645778.aspx 

现在用不同的代码例子来说明实现会话跟踪——隐藏表单域。

例子如下:第一个页面是登陆页面,第二个页面什么都不做,只负责提交到第三个页面,第三个页面负责显示来自于第一个页面的用户名。3个页面,2次不同的请求,但是也可以实现会话跟踪。

Login.jsp

<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
登陆页面
</title>
</head>
<body bgcolor="#536da5">
<h1>
登陆页面
</h1>
<form method="post" action="/HiddenModule/hiddenservlet">   --页面提交POST方法,由HiddenServlet处理表单
<br><br>
  <table width="100%" align="center">
    <tr>
      <td>姓名</td>
      <td><input type="text" name="userName"/></td>                         --姓名
    </tr><tr>
      <td>密码</td>
      <td><input type="password" name="userPwd"/></td>               --密码
    </tr><tr>
      <td><input type="submit" name="Submit" value="登陆"></td>
      <td><input type="reset" value="重设"></td>
    </tr>
  </table>
</form>
</body>
</html>

HiddenServlet.java

package hiddendemo;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class HiddenServlet
    extends HttpServlet {

 public void doPost(HttpServletRequest request, HttpServletResponse response) throws
      ServletException, IOException {
      System.out.println("HiddenServlet 的doGet()已经被调用!");
    response.setContentType("text/html; charset=GBK");
    PrintWriter out = response.getWriter();
    String userName = request.getParameter("userName");        //得到来自于请求页面中 叫userName参数的值
    out.println("<html>");
    out.println("<head><title>第二个页面</title></head>");

//回发给客户端的页面,如果这个页面提交的话,由POST方法处理请求,这个页面提交后由 InfoServlet 来处理
    out.println("<form action=/"/HiddenModule/infoservlet/" method=/"post/">"); 
    out.println("<body bgcolor=/"#ffffff/">");
    out.println("<h1 align=/"center/">这个页面是HiddenServlet处理来自于Login.jsp的请求后回发的页面");
    out.println("<table width=/"100%/" align=/"center/">");
    out.println("<tr><td>");
    out.println("<input type=/"hidden/" name=/"hiddenName/" value=/"");    //隐藏表单域
    out.println(userName);                                                                                     //隐藏的值,是来自第一个页面的用户名
    out.println("/"");
    out.println("<p>已经将来自于第一个页面的姓名放在了隐藏域里面,对于用户是透明的!");
    out.println("</td></tr><tr><td>");
    out.println("<input type=/"submit/" value=/"转向下一个页面看一看/" >");
    out.println("</td></tr></table></body></html>");
    out.close();
  }
}

InfoServlet.java

package hiddendemo;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class InfoServlet
    extends HttpServlet {

  public void doPost(HttpServletRequest request, HttpServletResponse response) throws
      ServletException, IOException {
    response.setContentType("text/html; charset=gb2312");
    PrintWriter out = response.getWriter();
    String userName = request.getParameter("hiddenName"); --来自第二个页面的值 在第二个页面中是看不见的
    out.println("<html>");
    out.println("<body bgcolor=/"#ffffff/">");
    out.println("<p>用户姓名是: " + userName +                                                    --打印出来
                ". 这是从HiddenServlet回发页面中隐藏域提交来的值.</p>");
    out.println("</body></html>");
    out.close();
  }
}

Login.jsp

Login.jsp 提交到 HiddenServlet 处理

由 HiddenServelt 通过 out.println() 生成客户端回发的页面如上,再次点击“转向下一个页面看一看”时将由在     out.println("<form action=/"/HiddenModule/infoservlet/" method=/"post/">");  里面的 InfoServlet 处理,结果如下:

 

··················································

这个例子就通过隐藏表单域实现了 从第一个页面提交的值在第三个页面显示,而在第二个页面中将其隐藏,在提交表单的时候,第三个页面就可以得到结果。

但是里面不能处理中文,如果在第一个页面输入的是中文,那么在第二个页面,和第三个页面得到的就是乱码。这是因为:表单的数据是存放在 request 对象中。请求的数据是以字节流的形式在网络上传输。当服务器接受到字节流形式的HTTP请求后,是按照 is0-8859-1 的方式解析数据。这样如果输出页面设置字符集为 gb2312 /gbk 的话,那么将无法正确显示表单中的中文数据。

关于如何正确处理中文乱码的文章下次有空再详细写一写!

原创粉丝点击