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

By | 2015年3月4日

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


//接口模块中的方法
public void consolePanel(Map params) throws IOException {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
Map clientMap = (Map) 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("");
out.print("

");
out.print("");
out.print("");
out.print("

");
out.print("");
}

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

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

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


public void consolePanel(Map params) throws IOException {
  HttpServletResponse response = ServletActionContext.getResponse();
  response.setContentType("text/html;charset=utf-8");
  Map clientMap = (Map) 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("");
  //表单自动提交之后,通过javascript来实现页面的跳转
  out.print("");
  out.print("

");
  out.print("");
  out.print("");
  out.print("

");
  out.print("");
}

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

public void consolePanel(Map params) throws IOException {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
Map clientMap = (Map) 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("");
out.println("");
out.println("");
out.println("

");
out.println("");
out.println("");
out.println("

");
out.println("");
}