模拟表单自动提交页面不跳转的解决方案

在开发插件模块的时候,需要从系统获取用户的帐号和密码,然后通过自动提交表单请求,跳转到XenSystem的控制面板,最初的实现是这样的:

//接口模块中的方法
public void consolePanel(Map<String, String> params) throws IOException {
   HttpServletResponse response = ServletActionContext.getResponse();
   response.setContentType("text/html;charset=utf-8");
   Map<String,String> clientMap = (Map<String, String>) JSONObject.toBean(JSONObject.fromObject(params.get("client")),Map.class);
   PrintWriter out = response.getWriter();
   String host = apiUrl.substring(0, apiUrl.lastIndexOf("process.aspx"));
   String actionUrl = host +"process.aspx?c=login";
  //在body加载的自动提交表单
   out.print("<body onload='javascript:document.forms[0].submit();'>");
   out.print("<form target='actionForm' action='"+actionUrl+"' method='post'>");
   out.print("<input type='hidden' name='username' value='"+clientMap.get("username")+"'/>");
   out.print("<input type='hidden' name='password' value='"+clientMap.get("password")+"'/>");
   out.print("</form>");
   out.print("</body>");
}

这样可以实现表单的成功提交,但没法在提交之后跳转到控制面板的页面,解决思路:

自动提交之后,虽然没有出现控制面板的首页,但是通过直接访问面板的管理地址可以进入管理界面,说明登录已经成功。

程序可能通过判断请求头的Referer的信息,判断是否是通过页面登录从来决定是否进行页面的跳转,通过表单自动提交这样的方式,我们没法完成Referer的模拟。但是既然我们已经成功提交帐号密码信息,登录也已经成功,只是页面没有跳转,那么我们就可以将表单提交到一个iframe中,然后通过javascript进行页面的跳转,代码实现如下:

public void consolePanel(Map<String, String> params) throws IOException {
  HttpServletResponse response = ServletActionContext.getResponse();
  response.setContentType("text/html;charset=utf-8");
  Map<String,String> clientMap = (Map<String, String>) JSONObject.toBean(JSONObject.fromObject(params.get("client")),Map.class);
  PrintWriter out = response.getWriter();
  String host = apiUrl.substring(0, apiUrl.lastIndexOf("process.aspx"));
  String actionUrl = host +"process.aspx?c=login";
   //这个隐藏iframe接受表单的自动提交
  out.print("<iframe style='display:none' name='actionForm'></iframe>");
  //表单自动提交之后,通过javascript来实现页面的跳转
  out.print("<body onload='javascript:document.forms[0].submit();window.location.href=\""+host+"\"'>");
  out.print("<form target='actionForm' action='"+actionUrl+"' method='post'>");
  out.print("<input type='hidden' name='username' value='"+clientMap.get("username")+"'/>");
  out.print("<input type='hidden' name='password' value='"+clientMap.get("password")+"'/>");
  out.print("</form>");
  out.print("</body>");
}

存在问题:在提交之后立即跳转,会造成没有成功提交,应该等待一段时间之后,确保表单已经自动提交成功之后,然后进行页面的跳转。最后的方案:

public void consolePanel(Map<String, String> params) throws IOException {
  HttpServletResponse response = ServletActionContext.getResponse();
  response.setContentType("text/html;charset=utf-8");
  Map<String,String> clientMap = (Map<String, String>) JSONObject.toBean(JSONObject.fromObject(params.get("client")),Map.class);
  PrintWriter out = response.getWriter();
  String host = apiUrl.substring(0, apiUrl.lastIndexOf("process.aspx"));
  String actionUrl = host +"process.aspx?c=login";
  out.println("<iframe style='display:none' name='actionForm'></iframe>");
  out.println("<body onload='javascript:autoSubmit()'/>");
  out.println("<script type='text/javascript'>");
  out.println("function autoSubmit(){");
  out.println("document.forms[0].submit();");
  //利用setTimeout来延时500毫秒执行
  out.println("setTimeout(\"window.location.href='"+host+"'\",500)");;
  out.println("}");
  out.println("</script>");
  out.println("<form target='actionForm' action='"+actionUrl+"' method='post'>");
  out.println("<input type='hidden' name='username' value='"+clientMap.get("username")+"'/>");
  out.println("<input type='hidden' name='password' value='"+clientMap.get("password")+"'/>");
  out.println("</form>");
  out.println("</body>");
}

本文出自 全栈笔记 版权所有,你可以在保留原文地址:模拟表单自动提交页面不跳转的解决方案 及作者的情况下到你的网站或博客。

【上一篇】
【下一篇】

您可能感兴趣的文章:

发表评论

您必须 登录 后才能发表评论。