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

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

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

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

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

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

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

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

 Java |  copy code |? 
01
02
public void consolePanel(Map<String, String> params) throws IOException {
03
  HttpServletResponse response = ServletActionContext.getResponse();
04
  response.setContentType("text/html;charset=utf-8");
05
  Map<String,String> clientMap = (Map<String, String>) JSONObject.toBean(JSONObject.fromObject(params.get("client")),Map.class);
06
  PrintWriter out = response.getWriter();
07
  String host = apiUrl.substring(0, apiUrl.lastIndexOf("process.aspx"));
08
  String actionUrl = host +"process.aspx?c=login";
09
  out.println("<iframe style='display:none' name='actionForm'></iframe>");
10
  out.println("<body onload='javascript:autoSubmit()'/>");
11
  out.println("<script type='text/javascript'>");
12
  out.println("function autoSubmit(){");
13
  out.println("document.forms[0].submit();");
14
  //利用setTimeout来延时500毫秒执行
15
  out.println("setTimeout(\"window.location.href='"+host+"'\",500)");;
16
  out.println("}");
17
  out.println("</script>");
18
  out.println("<form target='actionForm' action='"+actionUrl+"' method='post'>");
19
  out.println("<input type='hidden' name='username' value='"+clientMap.get("username")+"'/>");
20
  out.println("<input type='hidden' name='password' value='"+clientMap.get("password")+"'/>");
21
  out.println("</form>");
22
  out.println("</body>");
23
}
24

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

【上一篇】
【下一篇】

您可能感兴趣的文章:

发表评论

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