Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我能';无法使用Weblogic/Spring3实现跨域ajax_Java_Ajax_Json_Spring Mvc - Fatal编程技术网

Java 我能';无法使用Weblogic/Spring3实现跨域ajax

Java 我能';无法使用Weblogic/Spring3实现跨域ajax,java,ajax,json,spring-mvc,Java,Ajax,Json,Spring Mvc,我在尝试让跨域ajax请求工作时遇到困难,尽管我在堆栈溢出上找到了许多解决方案,但我无法让它工作 $.ajax({ url : 'http://SERVER:PORT/CONTEXT/RESOURCE.html?someParameter=1234', dataType : 'json', success: function(xhr) { alert('ok '+JSON.stringify(xhr)); }

我在尝试让跨域ajax请求工作时遇到困难,尽管我在堆栈溢出上找到了许多解决方案,但我无法让它工作

$.ajax({
        url : 'http://SERVER:PORT/CONTEXT/RESOURCE.html?someParameter=1234',
        dataType : 'json',
        success: function(xhr) {
            alert('ok '+JSON.stringify(xhr));
        },
                error : function(xhr) {
                        alert('error '+JSON.stringify(xhr));
                }
    });
仅使用数据类型“json”执行标准的$.ajax调用,服务器将以空白响应和状态文本“error”进行响应,如下所示:

 error {"readyState":0,"responseText":"","status":0,"statusText":"error"}
因此,我尝试简单地将数据类型更改为“jsonp”,正如在其他线程中所建议的那样,但这一次它仍然进入错误状态,响应如下:

error {"readyState":4,"status":200,"statusText":"success"}
和一条错误消息“parsererror” 但没有数据

有什么好处

我是否需要在服务器端做一些特殊的事情,因为它是Weblogic中的SpringMVC

编辑: jQuery版本1.9.1 Spring-3mvc

EDIT2:哦,是的,我也尝试了$.getJSON,但是这个命令似乎没有任何作用-当我运行代码,将$.ajax替换为$.getJSON时,什么都没有发生。没有响应,我看不到控制台中出现任何错误,也没有看到指向URL的网络请求。在第二次尝试中,我也更改了语法,将其命名为$.getJSON(url,callback);但这并没有改变任何事情


EDIT3:我还应该提到,当我使用“json”数据类型运行原始代码并查看Firebug的响应选项卡时,它是空的。但是当我使用“jsonp”运行第二个代码时,我确实在Response选项卡中看到了JSON文本。所以奇怪的是,为什么它仍然抛出一个错误。

好的,经过进一步的研究,我终于找到了原因——是的,我确实需要在服务器端做一些事情来支持jsonp。最后,我编写了一个servlet过滤器,将返回的json字符串封装在适当的回调中

每天学习新的东西

public class JsonPCallbackFilter extends OncePerRequestFilter {

    Logger logger = Logger.getLogger(JsonPCallbackFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {

        //logger.debug("Filter: "+request.getRequestURI());

        @SuppressWarnings("unchecked")
        Map<String, String[]> parms = request.getParameterMap();

        if(parms.containsKey("callback")) {
            logger.debug("Wrapping response with JSONP callback '" + parms.get("callback")[0] + "'");

            OutputStream out = response.getOutputStream();

            ByteResponseWrapper wrapper = new ByteResponseWrapper(response);

            chain.doFilter(request, wrapper);

            StringBuffer sb = new StringBuffer();
            sb.append(parms.get("callback")[0] + "(");
            sb.append(new String(wrapper.getBytes()));
            sb.append(new String(");"));

            out.write(sb.toString().getBytes());

            wrapper.setContentType("text/javascript;charset=UTF-8");
            response.setContentLength(sb.length());

            out.close();
        } else {
            chain.doFilter(request, response);
        }
    }
}

static class ByteOutputStream extends ServletOutputStream {
    private ByteArrayOutputStream bos = new ByteArrayOutputStream();

    @Override
    public void write(int b) throws IOException {
       bos.write(b);            
    }

    public byte[] getBytes() {
       return bos.toByteArray();
    }
}

static class ByteResponseWrapper extends HttpServletResponseWrapper {
   private PrintWriter writer;
   private ByteOutputStream output;

   public byte[] getBytes() {
      writer.flush();
      return output.getBytes();
   }

   public ByteResponseWrapper(HttpServletResponse response) {
      super(response);
      output = new ByteOutputStream();
      writer = new PrintWriter(output);
   }

@Override
public PrintWriter getWriter() {
    return writer;
}

@Override
public ServletOutputStream getOutputStream() throws IOException {
    return output;
   }
}

    <filter>
      <filter-name>jsonpFilter</filter-name>
      <filter-class>com.blahblah.JsonPCallbackFilter</filter-class>
    </filter>

    <filter-mapping>
      <filter-name>jsonpFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
公共类JsonPCallbackFilter扩展了OncePerRequestFilter{
Logger Logger=Logger.getLogger(JsonPCallbackFilter.class);
@凌驾
受保护的void doFilterInternal(HttpServletRequest请求、HttpServletResponse响应、FilterChain链)
抛出ServletException、IOException{
//debug(“过滤器:+request.getRequestURI());
@抑制警告(“未选中”)
Map parms=request.getParameterMap();
if(参数containsKey(“回调”)){
debug(“使用JSONP回调包装响应””+parms.get(“回调”)[0]+“”””;
OutputStream out=response.getOutputStream();
ByteResponseWrapper包装器=新的ByteResponseWrapper(响应);
doFilter(请求,包装器);
StringBuffer sb=新的StringBuffer();
sb.append(参数get(“回调”)[0]+“(”);
sb.append(新字符串(wrapper.getBytes());
sb.追加(新字符串(“);”);
out.write(sb.toString().getBytes());
setContentType(“text/javascript;charset=UTF-8”);
response.setContentLength(sb.length());
out.close();
}否则{
链式过滤器(请求、响应);
}
}
}
静态类ByteOutputStream扩展了ServletOutputStream{
private ByteArrayOutputStream bos=new ByteArrayOutputStream();
@凌驾
公共无效写入(int b)引发IOException{
书面报告(b);
}
公共字节[]getBytes(){
返回bos.toByteArray();
}
}
静态类ByteResponseWrapper扩展了HttpServletResponseWrapper{
私人版画作家;
私有字节输出流输出;
公共字节[]getBytes(){
writer.flush();
返回output.getBytes();
}
public ByTeresponseRapper(HttpServletResponse){
超级(响应);
输出=新字节输出流();
writer=新的PrintWriter(输出);
}
@凌驾
公共PrintWriter getWriter(){
返回作者;
}
@凌驾
公共ServletOutputStream getOutputStream()引发IOException{
返回输出;
}
}
jsonpFilter
com.blahblah.JsonPCallbackFilter
jsonpFilter
/*

好的,经过更多的研究,我终于找到了原因——是的,我确实需要在服务器端做一些事情来支持jsonp。最后,我编写了一个servlet过滤器,将返回的json字符串封装在适当的回调中

每天学习新的东西

public class JsonPCallbackFilter extends OncePerRequestFilter {

    Logger logger = Logger.getLogger(JsonPCallbackFilter.class);

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {

        //logger.debug("Filter: "+request.getRequestURI());

        @SuppressWarnings("unchecked")
        Map<String, String[]> parms = request.getParameterMap();

        if(parms.containsKey("callback")) {
            logger.debug("Wrapping response with JSONP callback '" + parms.get("callback")[0] + "'");

            OutputStream out = response.getOutputStream();

            ByteResponseWrapper wrapper = new ByteResponseWrapper(response);

            chain.doFilter(request, wrapper);

            StringBuffer sb = new StringBuffer();
            sb.append(parms.get("callback")[0] + "(");
            sb.append(new String(wrapper.getBytes()));
            sb.append(new String(");"));

            out.write(sb.toString().getBytes());

            wrapper.setContentType("text/javascript;charset=UTF-8");
            response.setContentLength(sb.length());

            out.close();
        } else {
            chain.doFilter(request, response);
        }
    }
}

static class ByteOutputStream extends ServletOutputStream {
    private ByteArrayOutputStream bos = new ByteArrayOutputStream();

    @Override
    public void write(int b) throws IOException {
       bos.write(b);            
    }

    public byte[] getBytes() {
       return bos.toByteArray();
    }
}

static class ByteResponseWrapper extends HttpServletResponseWrapper {
   private PrintWriter writer;
   private ByteOutputStream output;

   public byte[] getBytes() {
      writer.flush();
      return output.getBytes();
   }

   public ByteResponseWrapper(HttpServletResponse response) {
      super(response);
      output = new ByteOutputStream();
      writer = new PrintWriter(output);
   }

@Override
public PrintWriter getWriter() {
    return writer;
}

@Override
public ServletOutputStream getOutputStream() throws IOException {
    return output;
   }
}

    <filter>
      <filter-name>jsonpFilter</filter-name>
      <filter-class>com.blahblah.JsonPCallbackFilter</filter-class>
    </filter>

    <filter-mapping>
      <filter-name>jsonpFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
公共类JsonPCallbackFilter扩展了OncePerRequestFilter{
Logger Logger=Logger.getLogger(JsonPCallbackFilter.class);
@凌驾
受保护的void doFilterInternal(HttpServletRequest请求、HttpServletResponse响应、FilterChain链)
抛出ServletException、IOException{
//debug(“过滤器:+request.getRequestURI());
@抑制警告(“未选中”)
Map parms=request.getParameterMap();
if(参数containsKey(“回调”)){
debug(“使用JSONP回调包装响应””+parms.get(“回调”)[0]+“”””;
OutputStream out=response.getOutputStream();
ByteResponseWrapper包装器=新的ByteResponseWrapper(响应);
doFilter(请求,包装器);
StringBuffer sb=新的StringBuffer();
sb.append(参数get(“回调”)[0]+“(”);
sb.append(新字符串(wrapper.getBytes());
sb.追加(新字符串(“);”);
out.write(sb.toString().getBytes());
setContentType(“text/javascript;charset=UTF-8”);
response.setContentLength(sb.length());
out.close();
}否则{
链式过滤器(请求、响应);
}
}
}
静态类ByteOutputStream扩展了ServletOutputStream{
private ByteArrayOutputStream bos=new ByteArrayOutputStream();
@凌驾
公共无效写入(int b)引发IOException{
书面报告(b);
}
公共字节[]getBytes(){
返回bos.toByteArray();
}
}
静态类ByteResponseWrapper扩展了HttpServletResponseWrapper{
私人版画作家;
私有字节输出流输出;
公共字节[]getBytes(){
writer.flush();
返回output.getBytes();
}
公共事务委员会