日期:2014-05-16  浏览次数:20495 次

使用Ext2的ScriptTagProxy对Struts2下的Jsonplugin进行AJAX跨域访问时的问题以及解决方案

使用HttpProxy不能进行跨域的访问``

会返回 Access to restricted URI denied" code: "1012 的错误```

用Ext.data.ScriptTagProxy替换HttpProxy可以实现跨域``

在Opera下正常``在Firefox下出现Invaild label错误``

原因在`

使用ScriptTagProxy时要从request参数中获得callback属性,把得到的参数跟json-data一起返回,因为返回的data是要在浏览器中执行的所以仅仅返回json-data是不够的,需要构造成

callBackName(json-data);

这种形式返回。

JAVA 代码如下:

String cb = request.getParameter("callback");//获得callback属性

response.getWriter()write(cb + “(”+ json-data + ");");//将json-data进行重新包装?
?如果使用struts2+jsonplugin的方式```

它默认的是返回json的数据部分````

就不能直接用JSONPLUGIN的拦截器````只能对ACTION进行改进``

首先要在ACTION里添加一个对从ScriptTagProxy传来的callback参数的接收方法``

程序代码
private String callback;
 public String getCallback() {
  return callback;
 }

 public void setCallback(String callback) {
  this.callback = callback;
 }
?

这里的参数名可以更改``

在scriptTagProxy中设置callback参数:callbackParam,如:

程序代码
proxy : new Ext.data.ScriptTagProxy({
   url :'http://192.168.1.54:8080/LEOSystem/json.txt'// 'http://extjs.com/forum/topics-remote.php',
   callbackParam: abc
  })
?

?

action中的方法就是改为

然后就是要手工用response实现数据的回传.

在execte()方法中:

程序代码
  try {  
   HttpServletResponse response = ServletActionContext.getResponse();
   response.setContentType("text/html");
   response.setCharacterEncoding("UTF-8");
   response
     .getWriter()
     .write(
       getCallback()
         + "("+JSONUtil.serialize(this)+");");
  } catch (JSONException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }

  return null;
?

JSONUtil类来自jsonplugin包```import com.googlecode.jsonplugin.JSONUtil;

它的serialize(Object)方法实现了从类到json数据字串的转化.

最后返回return null;`不再让struts2接手```

程序代码
private String abc;
 public String getAbc() {
  return abc;
 }

 public void setAbc(String abc) {
  this.abc= abc;
 }
?