今天,在老师的帮助下,终于解决了困然自己好些天的鹰眼服务跨域访问问题。首先回归一下问题的历程:
当我们在使用jsp中直接使用鹰眼所提供给我们的接口(如:http://api.map.baidu.com/trace/v2/entity/add)时,我们会发现浏览器并不会显示百度返回的信息,尽管操作已经成功。如下图:
这是因为现代浏览器有一个同源策略,禁止跨域访问资源。网上也给出了很多做法,比如设置cors,但是webservice是人家百度提供的,我怎么可能设置?还有的是说采用Tomcat提供的CorsFilter,但是具体怎么用我不清楚,试过了也似乎没有太大效果,最后还是选择服务代理的方式。废话少说,直接上图:
简述一下原理:
首先,我们在jsp前端页面向自己本地服务器的servlet提出请求,然后servlet完成相应的设置(如设置post还是get方式等等),再想百度的服务接口发送请求,百度服务器响应后会有一段json格式的响应,我们的servlet接受到后将这段相应传回给jsp,由此完成了jsp与百度webservice的数据传输。
代码如下:
前段页面yingyan.jsp
<%@ page import="com.GPSProject.PlansDAO" %> <%@page import="java.sql.ResultSet" %> <script src="jquery-1.8.3.min.js"></script> <script> var url="./YingyanServlet" $.ajax({ //向servlet传输数据 url:url, type:"POST", CORS:"'Access-Control-Allow-Origin", data:{ entity_name:"hp" }, success:function (data) { var json=eval("("+data+")"); alert(json["message"]); }, fail:function () { alert("Fail..."); } }) </script> 自己的Servletpackage com.GPSProject; import org.json.JSONObject; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; /** * Created by hedingjie on 2016/5/19. */ @WebServlet(name = "YingyanServlet") public class YingyanServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("调用了servlet"); OutputStreamWriter out=null; BufferedReader in=null; String result=""; try{ String entity_name=request.getParameter("entity_name"); URL realURL=new URL("http://api.map.baidu.com/trace/v2/entity/add"); URLConnection conn=realURL.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new OutputStreamWriter(conn.getOutputStream(),"utf-8"); // 发送请求参数 out.append("ak=自己的密钥&service_id=自己的服务号&entity_name="+entity_name); //out.print("ak=1uHf5KljhgeqzbWxVbKPVhRa&service_id=116740&entity_name=hp"); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader( new InputStreamReader(conn.getInputStream(),"UTF-8")); String line; while ((line = in.readLine()) != null) { result += line; } response.setContentType("text/jsp;charset=utf-8"); System.out.println(result); response.setCharacterEncoding("utf-8"); response.getWriter().print(result); }catch (Exception ex){ System.out.println("发送POST请求异常"); ex.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }成果:
以上便是我的总结,希望对各位有所帮助。
本文系原创,希望转载时能标明出处,谢谢!