前端-【学习心得】-跨域问题

我们知道,一般做web的时候会遇到所谓的跨域问题。

所谓跨域就是浏览器在全局层面禁止了页面加载或执行与自身来源不同的域的任何脚本。

比如我们本地开发的静态界面写的ajax请求如果 不进行配置是无法得到服务器响应的。

当然我们可以把静态界面放到服务器下,比如tomcat 的webapp,或者放到node express 项目的静态路径下,都可以访问成功,当然如果想要减轻服务器的负担,可以把静态文件用nginx代理。

不过不管怎么样开发起来还是多有不便,这里来跟大家分享下如何制作跨域的。

我们这里不适用jsonp,因为请求数据会被限制。

使用CORS,准备angular js作为服务端,express 作为服务端。

直接上代码,先上服务端:

var express = require(‘express‘); var path = require(‘path‘); var favicon = require(‘serve-favicon‘); var logger = require(‘morgan‘); var cookieParser = require(‘cookie-parser‘); var bodyParser = require(‘body-parser‘); var routes = require(‘./web_router‘); var app = express();// view engine setup app.set(‘views‘, path.join(__dirname, ‘views‘)); app.set(‘view engine‘, ‘jade‘);// uncomment after placing your favicon in /public //app.use(favicon(__dirname + ‘/public/favicon.ico‘)); app.use(logger(‘dev‘)); app.use(bodyParser()); app.use(bodyParser.urlencoded({     extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, ‘public‘))); app.all(‘/fruitpoint‘, function(req, res, next) {     res.header("Access-Control-Allow-Origin", "*");     res.header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Authorization, Accept, X-Requested-With");     res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");     res.header("X-Powered-By", ‘3.2.1‘)     if (req.method == "OPTIONS") res.send(200);     else next(); }); app.use(‘/fruitpoint‘, routes); // catch 404 and forward to error handler app.use(function(req, res, next) {     var err = new Error(‘Not Found‘);     err.status = 404;     next(err); }); // error handlers // development error handler // will print stacktrace if (app.get(‘env‘) === ‘development‘) {     app.use(function(err, req, res, next) {         res.status(err.status || 500);         res.render(‘error‘, {             message: err.message,             error: err         });     }); }// production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) {     res.status(err.status || 500);     res.render(‘error‘, {         message: err.message,         error: {}     }); });app.listen(3000); console.log("server start") module.exports = app;

首先展示express 的app.js ,这里给了一个路由 fruitpoint 在请求执行之前先增加跨域的设置,方法就是利用express可以截获多个请求然后放行,就在它之前再加一个。

设置响应支持跨域的代码

res.header("Access-Control-Allow-Origin", "*");    res.header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Authorization, Accept,     X-Requested-With");    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");    res.header("X-Powered-By", ‘3.2.1‘)    if (req.method == "OPTIONS") res.send(200);    else next();

然后就是客户端的比较简单,这里我直接把app.js,controller.js和servers.js合并展示:

var main = angular.module(‘fruit_index‘, []) 	.config(function($httpProvider) { 		$httpProvider.defaults.useXDomain = true; 		delete $httpProvider.defaults.headers 			.common[‘X-Requested-With‘]; 	}); main.factory(‘MainService‘, function($http) { 	return { 		getMainData: function() { 			return $http({ 				method: ‘post‘, 				url: ‘http://localhost:3000/fruitpoint‘, 				data: { 					base: { 					reqTime: ‘201409041455123‘, 					proNo: ‘90002‘ 					}, 					content: { 						MR_ID: ‘1234‘ 					},				} 			}); 		} 	}; }); main.controller("indexcontroller",function($scope,MainService){ 	$scope.name="s"; 	MainService.getMainData().success(function(data, status, headers){ 		console.log(data); 	}); });
<!DOCTYPE html> <html ng-app="fruit_index"> <head> <meta charset="utf-8"/> <title>xxxxxx</title> <meta name="keywords" content=""/> <meta name="description" content=""/> <meta name="viewport" content="width=device-width"/> <link rel="stylesheet" href="css/reset.css"/> <link rel="stylesheet" href="css/function.css"/> <link rel="stylesheet" href="css/media.css"/> <link rel="stylesheet" href="css/animation.css"/> <link rel="stylesheet" href="css/style.css"/> <link rel="shortcut icon" href="img/favicon.ico"/> <link rel="apple-touch-icon" href="img/touchicon.png"/> <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script> <script src="js/index.js"></script>  <script src="lib/angular/angular.js"></script> <script src="lib/angular-animate/angular-animate.js"></script> <script src="lib/angular-sanitize/angular-sanitize.js"></script> <script src="lib/angular-ui-router/release/angular-ui-router.js"></script> <script src="lib/moment/min/moment-with-locales.js"></script> <script src="lib/angular-moment/angular-moment.js"></script> <script src="lib/angular-resource/angular-resource.js"></script> <script src="js/app.js"></script> <script src="js/services/mainservice.js"></script> <script src="js/controllers/fruitindexController.js"></script> </head> <body class="f-ff1"> <div class="m-adv1"></div>         <div class="m-main">             <div class="m-maincl f-fl" ng-controller="indexcontroller">                                    <h1 class="title1">身边水果{{name}}</h1>             </div>       </div> </body> </html>

调用的静态页面东西多了点,但ng的标签还是挺简单的。

时间: 2024-10-05 05:42:11

前端-【学习心得】-跨域问题的相关文章

web前端学习历程--跨域问题

一.同源策略 一个页面的ajax只能获取这个页面相同源(协议.域名.端口号都必须相同)的数据. 二.jsonp方法 1.json和jsonp JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式 JSONP是JSON with Padding的略称.它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问 2.解决跨域的原理: 首先,<script>标签的src属性并不被同

小小六的前端学习心得

打算写这篇文章已经好久了,但是文采不行,不知道如何下笔,今天终于鼓起勇气用我拙劣的作文水平来讲述一下这段时间我学习前端开发的心得. 先从我的专业说起.我本人是学计算机的.全名是叫计算机科学与技术(软件方向),学校虽然是一个211学校,学习成绩也还行,但是对于编程这一块,真的是很弱很弱.所以我对计算机编程真正的学习是从实习这段时间开始的.说到这里,我必须得感谢带我进入前端的学长.因为他我才能在今天坐在这里写这篇学习心得. 所以,首先最好是有一个愿意耐心的指导你学习的人,也就是一个好的师傅.他能根据

vue.js学习之 跨域请求代理与axios传参

vue.js学习之 跨域请求代理与axios传参 一:跨域请求代理 1:打开config/index.js module.exports{ dev: { } } 在这里面找到proxyTable{},改为这样: proxyTable: { '/api': { target: 'http://121.41.130.58:9090',//设置你调用的接口域名和端口号 别忘了加http changeOrigin: true, pathRewrite: { '^/api': ''//这里理解成用'/ap

【前端学习笔记】原生Javascript中通过JSONP(前端常用方法)进行跨域

Ajax跨域-------------------------- 跨域: 跨域名 一个域名下的文件去请求了和他不一样的域名下的资源文件,那么就会产生跨域请求 这是ajax的跨域限制问题 跨域的解决 : jsonp: json width padding 核心: 1.script标签 2.用script标签加载资源是没有跨域问题的 3.script只认文件的实际内容,而不是后缀.只要内容是合法的js就能用 流程: 1.在资源加载进来之前定义好一个函数,这个函数接受一个参数(要取的数据) ,而将要加

Django 【第十九篇】JS实现的ajax、同源策略和前端jsonp解决跨域问题

一.回顾jQuery实现的ajax 首先说一下ajax的优缺点 优点: AJAX使用Javascript技术向服务器发送异步请求: AJAX无须刷新整个页面: 因为服务器响应内容不再是整个页面,而是页面中的局部,所以AJAX性能高: jquery 实现的ajax index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <t

zepto,kissy前端框架实现跨域

三.jsonp的原理:带有src属性标签的跨域资源获取能力,在jsonp中通常使用<script>标签,因为<script>标签获取的跨域资源可以使用回调函数直接处理 jsonp的实现: 前端代码: <script> function callback(data){ console.log(data); } </script> <script type="text/javascript" src="//www.remote

前端-关于CORS跨域的解决方案,面向服务端

最近自己在写后台管理系统的时候,并没有采用jsp.freemaker.叶子等模板技术,而是由后端提供数据api,前端通过AJAX和JQuery来动态操作页面上的一些div.table元素,从而实现报表的动态加载. 因为本人并非专业前端,所以采用的技术比较古老,对于最近的前端框架,vue,angular,react等等,暂且按下不表. 说说遇到的几个坑: 1.AJAX发送请求的时候,默认是异步的,而不是同步的. 基于低耦合的编码,我在写ajax时,数据请求和数据处理是分开的,没加同步执行就导致了我

前端如何去做跨域解决方案

前言 那些你,你常用的跨域解决方案除了jsonp 之外,还有其他的吗?今日早读文章可以告诉你,本文由 金蝶 @scq000授权分享. 正文从这开始~ 浏览器在请求不同域的资源时,会因为同源策略的影响请求不成功,这就是通常被提到的"跨域问题".作为前端开发,解决跨域问题应该是一个被熟练掌握的技能.而随着技术不断的更迭,针对跨域问题的解决也衍生出了多种解决方案.我们通常会根据项目的不同需要,而采取不同的方式.这篇文章,将详细总结跨域问题的相关知识点,以便在遇到相同问题的时候,能有一个清晰的

前端通信、跨域

首先了解什么是同源策略: 限制一个源加载的文档或脚本与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制.(来自MDN的解释) 源包括三个部分:协议.域名.端口(HTTP协议的默认端口是80).如果其中有任何一个部分不同,则源不同.即为跨域. 限制:这个源的文档没有权利去操作另一个源的文档.这个限制体现在: Cookie.LlocalStorage和IndexDB无法获取: 无法获取和操作DOM: 不能发送Ajax请求.(Ajax只适合同源的通信). 前后端的通信方式: A

Vue学习----webpack跨域问题proxyTable

跨域问题,搜索https://www.cnblogs.com/wancheng7/p/8987694.html,先学习一下, 在根目录config文件下的index.js中添加代码 '/api': { target: 'http://www.abc.com', //目标接口域名 changeOrigin: true, //是否跨域 pathRewrite: { '^/api': '/api' //重写接口 } }, 在App.vue下获取,将跨域的域名替换成/api/ created(){ th