WEB10-session

来源:互联网 发布:抢注域名技巧 编辑:程序博客网 时间:2024/06/09 16:43
表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。
当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝用户提交的表单请求:
存储Session域中的表单标识号与表单提交的标识号不同
当前用户的Session中不存在表单标识号
用户提交的表单数据中没有标识号字段
编写工具类生成表单标识号:TokenProcessor
一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码。
服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。
密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。
public class FormGenerateServlet extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html;charset=UTF-8");
  PrintWriter out = response.getWriter();
  
  //产生表单号
  TokenProcessor tp = TokenProcessor.getInstance();
  String token = tp.generateToken();
  request.getSession().setAttribute("token",token);
  
  out.print("<form action='/BookHistory/servlet/FormDealServlet' method='post'>");
  out.print("<input type='hidden' name='token' value='"+token+"'/>");
  out.print("用户名:<input type='text' name='username' />");
  out.print("<input type='submit' value='提交'/>");
  out.print("</form>");
 }
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}
 
 

public class FormDealServlet extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  
  boolean b = isTokenValidate(request);
  if(!b){
   System.out.println("请不要重复提交表单");
   return;
  }
  request.getSession().removeAttribute("token");
  System.out.println("向数据库注册用户信息。。。");

 }
 
 private boolean isTokenValidate(HttpServletRequest request){
  String client_token = request.getParameter("token");
  if(client_token==null){
   return false;
  }
  String server_token = (String) request.getSession().getAttribute("token");
  if(server_token==null){
   return false;
  }
  if(!client_token.equals(server_token)){
   return false;
  }
  
  return true;
 }

 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

  doGet(request, response);
 }

}