前段时间在做产品开发的时候,需要与公司网站那边进行交互,我们所开发的产品上线后是放在一个域名下,公司网站那块是在另一个域名下,这样在页面中调用
网站那边的接口时就存在跨域的问题,当时为了不修改网站那边的接口,所以采用在服务端通过webservice方式进行调用网站接口,问题也很快解决了,当时我就在想
如果需要在js中直接访问的话,就涉及到到跨域的问题,那么怎么做才能解决这个问题呢,我上网找了一些资料,最后采用的是jsonp的方式来解决的。下面我来给大家分享下
用jsonp方式解决跨域问题。分为以下步骤:
1、引入jquery.js,使用$.ajax()来定义jsonp,如下:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%
String path = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<script type="text/javascript" src="${path}/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
$(function(){
$("#jsonp").click(function(){
$.ajax({
url:"/demo/jsonp.action",
type:"GET",
async:false,
dataType:"jsonp",
jsonp:"jsonpCallback",
jsonpCallback:"showAge",
success:function(data){
//alert(data.name);
}
}
);
});
});
function showAge(data){
alert(data.age);
}
</script>
</head>
<body>
<a id="jsonp" href="">使用jsonp</a>
</body>
</html>
2、服务器端处理:
package com.mall.web.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSONObject;
@Controller
@RequestMapping("/demo/")
public class DemoAction {
private HttpServletRequest request;
private HttpServletResponse response;
@ModelAttribute
public void setRequestAndResponse(HttpServletRequest request,HttpServletResponse response){
this.request = request;
this.response = response;
}
@RequestMapping(value="jsonp",method=RequestMethod.GET)
public void jsonp(){
try {
response.setContentType("text/plain");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
PrintWriter out = response.getWriter();
JSONObject resultJSON = new JSONObject();
resultJSON.put("name", "wen");
resultJSON.put("age", "17");
String jsonpCallback = request.getParameter("jsonpCallback");//客户端请求参数
System.out.println("-------------------->"+jsonpCallback);
System.out.println("-------------------->"+resultJSON.toJSONString());
out.println(jsonpCallback+"("+resultJSON.toJSONString()+")");//返回jsonp格式数据
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
该访问的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的一些知识。
分享到:
相关推荐
**AJAX和JSONP跨域请求的实现过程** 1. **AJAX跨域**: 通常,AJAX请求受到同源策略限制。为实现跨域,我们可以使用CORS(Cross-Origin Resource Sharing)机制。服务器需要在响应头中添加`Access-Control-Allow-...
"jsonp跨域请求"可能是服务器返回的示例数据,模拟了JSONP的跨域请求过程。 总结,JSONP和CORS是解决JavaScript跨域问题的两种主要方法,它们各有优缺点,适用于不同的场景。JSONP简单易用,但安全性较低;CORS则更...
### JSONP 跨域请求数据实现手机号码查询实例分析 #### 前言 在现代Web开发中,跨域问题一直是前端开发者面临的一个常见难题。简单来说,由于浏览器的同源策略限制,当一个网页尝试从不同的源(即不同的协议、端口...
第25周-第06章节-Python3.5-JSONP跨域请求jQuery方式.avi
JSONP是早期解决跨域问题的手段,适用于只支持GET请求的情况。它的原理是利用HTML的`<script>`标签不受同源策略限制的特性,通过动态创建`<script>`标签来加载服务器返回的JavaScript代码,这个代码通常是一个函数...
JSONP(JSON with Padding)是一种解决跨域请求的方法,主要用于解决不同域之间因浏览器同源策略限制而无法进行AJAX请求的问题。在AJAX请求中,浏览器的同源策略限制了与当前页面不同域的服务器进行数据交互,而...
需要注意的是,虽然JSONP提供了一种灵活的跨域请求解决方案,但它也有一些局限性和安全风险。例如,JSONP允许执行任意的JavaScript代码,如果服务器端的输出没有经过严格验证和清洗,可能会导致跨站脚本攻击(XSS)...
总的来说,JSONP跨域请求是一种古老但有效的方式,用于解决浏览器同源策略带来的限制问题。它的优点是简单易用,支持跨域GET请求。但是,JSONP也有一定的安全风险,比如被恶意利用,因此在使用时需要谨慎。另外,...
在介绍Vue2.0使用vue-resource进行jsonp跨域请求之前,我们需要了解一些基础概念: 1. JSONP(JSON with Padding)是一种老旧的技术,用于绕过浏览器的同源策略。它通过动态创建标签的方式来实现跨域请求。 2. 在...
在Spring框架中处理JSONP跨域请求是一个常见问题,尤其当开发者需要从前端JavaScript代码中调用不同域上的RESTful服务时。由于浏览器的安全限制,同源策略防止了不同域的文档或脚本间的交互,这使得传统的AJAX请求不...
原生js实现ajax请求和JSONP跨域请求操作示例的知识点涉及了Web前端技术中的核心知识点,主要介绍的是如何使用JavaScript原生代码来发起网络请求以及如何处理跨域问题。以下是对给定文件内容中知识点的详细解读: 1....
这样做是为了支持JSONP跨域请求。 具体实现中,`writeInternal`方法是被重写的,用于处理HTTP响应的输出。首先,通过`RequestContextHolder`获取到当前的`HttpServletRequest`对象,然后检查请求参数中是否存在`...
在实际开发中,实现JSONP跨域请求时需要特别注意以下几点: 1. 确保服务器支持JSONP请求。通常需要服务器端支持输出callback函数名,并对返回数据进行格式化处理。 2. 服务器需要对JSONP请求进行安全校验,避免恶意...
在本项目"JSONP跨域实现百度搜索功能(v1.0.0)"中,我们将深入探讨如何利用JSONP技术来实现在网页上嵌入一个能够进行百度搜索的功能。 首先,我们需要理解为什么需要JSONP。浏览器的同源策略是出于安全考虑,不允许...
除了JSONP,还有多种跨域请求的方法,如: 1. **IFrame:** 通过嵌入一个IFrame来加载跨域内容,常用于实现页面间的通信。 2. **document.domain:** 同一顶级域名下的子域名可以通过设置`document.domain`来实现跨...
JSONP跨域请求是一种常用的前端技术,用以解决由于浏览器同源策略限制而导致的跨域访问问题。同源策略是指在Web浏览器中,为了保证用户信息的安全,浏览器对脚本能够访问的页面范围进行了限制。一般来说,如果两个...