解决百度鹰眼服务浏览器的跨域访问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23729557/article/details/51510013

今天,在老师的帮助下,终于解决了困然自己好些天的鹰眼服务跨域访问问题。首先回归一下问题的历程:

当我们在使用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);
    }
}
成果:

以上便是我的总结,希望对各位有所帮助。
本文系原创,希望转载时能标明出处,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_23729557/article/details/51510013