jsonp跨域访问服务

前端之家收集整理的这篇文章主要介绍了jsonp跨域访问服务前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前段时间在做产品开发的时候,需要与公司网站那边进行交互,我们所开发的产品上线后是放在一个域名下,公司网站那块是在另一个域名下,这样在页面调用

网站那边的接口时就存在跨域的问题,当时为了不修改网站那边的接口,所以采用在服务端通过webservice方式进行调用网站接口,问题也很快解决了,当时我就在想

如果需要在js中直接访问的话,就涉及到到跨域的问题,那么怎么做才能解决这个问题呢,我上网找了一些资料,最后采用的是jsonp的方式来解决的。下面我来给大家分享

用jsonp方式解决跨域问题。分为以下步骤:

1、引入jquery.js,使用$.ajax()来定义jsonp,如下:

  1. <%@pagelanguage="java"contentType="text/html;charset=utf-8"pageEncoding="utf-8"%>
  2. <%
  3. Stringpath=request.getContextPath();
  4. %>
  5. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  6. <htmlxmlns="http://www.w3.org/1999/xhtml">
  7. <head>
  8. <scripttype="text/javascript"src="${path}/js/jquery-1.7.2.min.js"></script>
  9. <scripttype="text/javascript">
  10. $(function(){
  11. $("#jsonp").click(function(){
  12. $.ajax({
  13. url:"/demo/jsonp.action",type:"GET",async:false,dataType:"jsonp",jsonp:"jsonpCallback",jsonpCallback:"showAge",success:function(data){
  14. //alert(data.name);
  15. }
  16. }
  17. );
  18. });
  19. });
  20. functionshowAge(data){
  21. alert(data.age);
  22. }
  23. </script>
  24. </head>
  25. <body>
  26. <aid="jsonp"href="">使用jsonp</a>
  27. </body>
  28. </html>

2、服务器端处理:

  1. packagecom.mall.web.action;
  2. importjava.io.IOException;
  3. importjava.io.PrintWriter;
  4. importjava.util.HashMap;
  5. importjava.util.Map;
  6. importjavax.servlet.http.HttpServletRequest;
  7. importjavax.servlet.http.HttpServletResponse;
  8. importorg.springframework.stereotype.Controller;
  9. importorg.springframework.web.bind.annotation.ModelAttribute;
  10. importorg.springframework.web.bind.annotation.RequestMapping;
  11. importorg.springframework.web.bind.annotation.RequestMethod;
  12. importorg.springframework.web.servlet.ModelAndView;
  13. importcom.alibaba.fastjson.JSONObject;
  14. @Controller
  15. @RequestMapping("/demo/")
  16. publicclassDemoAction{
  17. privateHttpServletRequestrequest;
  18. privateHttpServletResponseresponse;
  19. @modelattribute
  20. publicvoidsetRequestAndResponse(HttpServletRequestrequest,HttpServletResponseresponse){
  21. this.request=request;
  22. this.response=response;
  23. }
  24. @RequestMapping(value="jsonp",method=RequestMethod.GET)
  25. publicvoidjsonp(){
  26. try{
  27. response.setContentType("text/plain");
  28. response.setHeader("Pragma","No-cache");
  29. response.setHeader("Cache-Control","no-cache");
  30. response.setDateHeader("Expires",0);
  31. PrintWriterout=response.getWriter();
  32. JSONObjectresultJSON=newJSONObject();
  33. resultJSON.put("name","wen");
  34. resultJSON.put("age","17");
  35. StringjsonpCallback=request.getParameter("jsonpCallback");//客户端请求参数
  36. System.out.println("-------------------->"+jsonpCallback);
  37. System.out.println("-------------------->"+resultJSON.toJSONString());
  38. out.println(jsonpCallback+"("+resultJSON.toJSONString()+")");//返回jsonp格式数据
  39. out.flush();
  40. out.close();
  41. }catch(IOExceptione){
  42. e.printStackTrace();
  43. }
  44. }
  45. }

该访问的URL地址为:/demo/jsonp.action?jsonpCallback=“showAge”

在上述事例中,需要注意以下几点:

1、jsonp中只能使用get请求,ajax请求中dataType为jsonp

2、jsonp定义的URL地址中的参数名默认为callback

3、jsonpCallback定义的时jsonp定义的参数对应的值,也是服务器需要回调的函数,若jsonpCallback为定义值,默认回调success函数

4、服务器接受请求后,需要返回符合参数传递过来的回调函数如:

out.println(jsonpCallback+"("+resultJSON.toJSONString()+")");//返回jsonp格式数据


以上就是jsonp的访问过程,这里需要大家好好理解。因为使用jsonp跨域访问,需要客户端和服务端定义一个规则,即回调函数的规则,所以

在开发的过程中需要客户端和服务端的开发人员共同定义一个规则。

其实我们还可以通过$.get()和$.getJson()方式来跨域访问,这里就不跟大家细说了,如果感兴趣的朋友,可以自己去了解下,今天就给大家分享到这,

我们下期再见,接下来会为大家分享android的一些知识。

猜你在找的Json相关文章