Java 我能';无法使用Weblogic/Spring3实现跨域ajax
我在尝试让跨域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({
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();
}
公共事务委员会