1. 解决跨域必须在ajax 方法中dataType 设置为jsonp
2. 此时服务端返回的就必须是jsonp 类型的,而不是json 类型的
3. 客户端js 代码中ajax 方法还要设置jsonpCallback 这个属性
4. jquery 版本据说用1.5以上,我用jquery-1.7.2.min.js
5.这个难说是BUG 还是特定写法,总之解决了
6.设置了jsonp 返回之后,async:false 这个选项就不能用了,即不能用同步,ajax 必须是使用默认的异步方式了
前端代码:(红色是此场景的必须的写法)
- function getSearchResult(query) {
- $.ajax({
- type: "get",url: "http://10.32.17.7:2360?<span style="color:#ff0000;">prefix=?</span>",<span style="color:#ff0000;">jsonpCallback</span>:"<span style="color:#ff0000;">myjsonpcallbacknameinalllowercase</span>",//这个名字可以改,但是要与服务端设置的对应
- <span style="color:#ff0000;"> dataType: 'jsonp',</span>
- data: {format:"jsonp",name:"aaa"},//async: false,//false 为同步方式
- success: function (data) {
- alert(data.length)
- /* for(var i = 0;i < data.length;i++) {
- for(var j in data[i]) {
- alert(j+" : "+data[i][j])
- }
- } */
- }
- });
- /* $.get( //这个默认异步,故result 无法被赋值
- "http://10.2.6.81:2360/leisurehotel/search?return=hotelid,hotelname§ion=1,3",function(data){
- result1 = 'aaa '+ data
- }//返回的data是字符串类型
- ); */
- return result;
- }
后端代码:(红色是此场景的必须的写法)
- package com.ctrip.search.engine;
- import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH;
- import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE;
- import static io.netty.handler.codec.http.HttpResponseStatus.OK;
- import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
- import java.nio.charset.Charset;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.alibaba.fastjson.JSONPObject;
- import com.alibaba.fastjson.serializer.SerializerFeature;
- import io.netty.buffer.ByteBuf;
- import io.netty.buffer.Unpooled;
- import io.netty.channel.ChannelFutureListener;
- import io.netty.channel.ChannelHandlerContext;
- import io.netty.channel.SimpleChannelInboundHandler;
- import io.netty.handler.codec.http.DefaultFullHttpResponse;
- import io.netty.handler.codec.http.FullHttpRequest;
- import io.netty.handler.codec.http.FullHttpResponse;
- import io.netty.handler.codec.http.QueryStringDecoder;
- public class NettyServerHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
- StringBuilder sb = new StringBuilder();
- JSONArray jsonarray = new JSONArray();
- JSONObject jsonobject = new JSONObject();
- JSONPObject jsonpobject = new JSONPObject();
- public NettyServerHandler() {
- jsonarray.add(getJsonObj("name","ar.arch.lolplay"));
- jsonarray.add(getJsonObj("name","ar.arch.tict"));
- jsonarray.add(getJsonObj("name","ar.arch.gfl"));
- jsonarray.add(getJsonObj("name","ar.arch.leurehotel"));
- <span style="color:#ff0000;">jsonpobject.setFunction("myjsonpcallbacknameinalllowercase");
- jsonpobject.addParameter(jsonarray);</span>
- }
- public JSONObject getJsonObj(String name,String value) {
- JSONObject jsonobj = new JSONObject();
- jsonobj.put(name,value);
- return jsonobj;
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause) throws Exception {
- cause.printStackTrace();
- }
- @Override
- protected void channelRead0(ChannelHandlerContext ctx,FullHttpRequest msg) //
- throws Exception {//函数执行次数?
- //解析get请求参数
- QueryStringDecoder decoder = new QueryStringDecoder(msg.getUri());
- Map<String,List<String>> parame = decoder.parameters();
- for(Entry<String,List<String>> entry : parame.entrySet()) {
- System.out.println(entry.getKey() + " : " +entry.getValue());
- }
- FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1,OK); // 响应
- response.headers().set(CONTENT_TYPE,"text/html; charset=UTF-8");
- ByteBuf responseContentByteBuf = Unpooled.copiedBuffer(<span style="color:#ff0000;">jsonpobject.toString()</span>.getBytes(Charset.forName("utf-8")));
- response.headers().set("Access-Control-Allow-Origin","*"); // 跨域
- response.headers().set(CONTENT_LENGTH,responseContentByteBuf.readableBytes());
- response.content().writeBytes(responseContentByteBuf);
- responseContentByteBuf.release();//zuoyong?
- ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);//zuoyong?
- }
- }