今天,在老师的帮助下,终于解决了困然自己好些天的鹰眼服务跨域访问问题。首先回归一下问题的历程:
当我们在使用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>
自己的Servlet
package 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);
}
}
成果:
解决百度鹰眼服务浏览器的跨域访问题
以上便是我的总结,希望对各位有所帮助。
本文系原创,希望转载时能标明出处,谢谢!