JSONP的理解

JSONP作为js跨域请求的一个方案,很早就知道了,一直没有详细了解。今天了解了一下,记录下来。

JSONP 是 JSON with Padding 是缩写。是指定数据格式json的一种使用模式,可以让网页从别的域名要数据。

我们都知道浏览器安全最基本的就是“同源策略”

同源策略是指URL的三个要素:

  • 协议相同
  • 域名相同
  • 端口相同

它会限制三种行为:

  • Cookie、LocalStorage
  • DOM 无法获得
  • AJAX 请求不能发送

同源策略的目的是为了保证用户信息的安全。因此是必要的。
但是有时候对开发来讲也会不方便,尤其是 ajax 请求。

因些就是有 jsonp 的方案。

从上面的限制列表中可以看到,浏览器的同源策略限制了 Cookie, DOM, Ajax, 但是是没有HTML的一些标签,比如:

1
2
<img src="">
<script src="">

比如 A 站点的地址是 http://example1.com/page/test.html, 页面上的 script 是

1
<script src="http://example2.com/test.js"></script>

是可以请求到数据,浏览器并不做限制。这样就可以执行 example2.com 上的js文件了。

但是我们有时候需要一种理自由的处理example2.com 上的数据,就需要在 example2.com 上写一些接口,比如:
http://example2.com/test.php
比如这个接口返回json: {“result”: “This is test”}.
但是 script 标签对于返回的 json 并没有什么用。而且script 的返回是由js解析器直接执行了。
因此,我们可以直接 js 函数,或者 js 函数的调用,比如:

1
process({"result": "This is test"});

这样我们就实现了在 example1.com 站点上调用 example2.com 上数据的目的。

Mac 下 SSH Clone Session

因为公司用的是 windows 电脑,连接服务器使用的是 SecureCRT. 这个软件有个非常好用的功能,克隆会话。每天只需要第一次连接的时候使用密码,其它时候就直接克隆会话。

但是回家后是使用自己的 Mac, 于是也想实现这样的效果。于是 Google 一下。

发现其实是 ssh config 的一个功能。所以实现过程如果下:

先切到 .ssh 目录。在主目录下,

1
cd .ssh

然后新建一个 config 文件,并且内容为:

1
vi config
1
2
3
host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p

然后你在一个终端下用 ssh 登陆服务器,是需要输入密码的,再新建一个终端tab, 再 ssh 到同一个服务,这次就不用输入密码了,自动登陆。
到此,克隆会话完成。

Config 内容解释:

  • host : ssh 的 confg 是按 host 来匹配的。这里星号表示下面的配置适用于所有的主机。

  • ControlMaster : 开启同一个网络连接的 session 共享。这里可以有多个值,auto 表示后面新建的 ssh 连接的时候,如果存在 master 连接,就复用,如果不存在,就新建一个。新建的话是需要输入密码的。

  • ControlPath : ssh 用 ControlPath 参数来表示一个连接。%r 表示 ssh 登陆名。%h 表示登陆主机名。%p 表示 ssh 远程登陆端口。

Git 不能正常显示中文文件名的问题解决方法

一直以来都使用 Git 来管理代码,而代码的文件名都是英文,因此从来没有试过用 Git 来管理中文文件。今天偶然想使用 Git 来管理一些
中文文件,发现原来在 Git 下,运行

1
git status

时中文文件名显示的转义名,就是以 ‘\’ 开头的字符。
于是就查了 Git 的 man 手册。原来 git config 中一项,core.quotePath 造成这样的问题。

大概意思就是 command 中输出的文件路径中,如果有“非正常”字符,将会把这些字符以 C 语言转义控制字符那样转义,并把它们放到双引号民中。

如果 core.quotepath 这个选项的值是 ture, 那么 git 会把字节值大于 0x80 的字符(其实就是非 ASCII 字符)认为是非法字符。
这个选项的默认值是 ture.

所以这个问题的正确解法是,把这个选项设置成 false.

1
git config --global core.quotepath false

再运行一次 git status, 将会看到,中文文件名可以正常显示了。

Python raw 字符串不能以反斜线结尾

Python raw 字符串可以禁止字符串中的反斜线后的字符转义。

尽管 raw 字符串很有用, 但是一个raw 字符串也不能以单个的反斜线结尾, 因为, 反斜线会转义后续引用的字符, 仍然必须转义外围引号字符以将其嵌入到该字符串中. 也就是说, r’..\’ 不是一个有效的字符中常量, 一个raw字符串不能以奇数个反斜线结束.

如果需要用单个的反斜线结束一个raw 字符串, 有几种方法:

可以使用两个反斜线并分片掉第二个反斜线( r’1\nb\tc\‘[:-1])

或手动添加一个反斜线(r’1\nb\tc’ + ‘\‘)

或忽略raw字符串语法并在常规字符口中中把反斜线改为又反斜线( r’1\nb\tc\‘)

以上三种形式都会创建同样的字符串. 字符串的最后包含一个反斜线

Laravel 5.3 中使用Authorizatioin Middleware时,参数不能正确解析

Laravel 5.3 的 Authorization 使用非常方便,一般的用法是在 Controller 中手动调用.

1
2
3
if ($user->can('view', $post)) {

}

这已经非常方便了,但是 Laravel 还提供了一种更方便的方法,使用 Middleware 在 Route 中 authorization.
但是我按官方文档上的说明进行调用,参数总不能正确解析:

1
Route::get('/posts/{post}', 'PostController@show')->middleware('can:view,post');

通过这样调用,Controller 中接到的参数仍然是 post id, 是个数字。

放狗搜了一下才知道,原来是需要先使用 Middleware bings 来对参数进行绑定。代码如下:

1
Route::get('/posts/{post}', 'PostController@show')->middleware('bindings', 'can:view,post');

一试果然管用。

VIM白天用Dark背景,晚上用Light背景

启动vim的时候,根据现在的时间是白天还是晚上,应用不同的背景。
打开.vimrc。

1
2
3
4
5
if strftime("%H") > 6 && strftime("%H") < 18
set background=dark
else
set background=light
endif

这只会在启动vim的时候启用不同的背景。如果是vim从白天打开,到晚上一直没有关,背景也不会有变化。所以下一步我们就是要解决这个问题。
每次用vim写代码,:w用的很多。所以我们在每次保存文件的时候,执行一次~/.vimrc文件。

1
2
3
if has('autocmd')
autocmd bufwritepost * source ~/.vimrc
endif

至此,已经完成。

Vim粘贴代码格式乱的问题

从别的地方往vim里复制内容的时候,尤其是代码,会因为vim的缩进,造成格式全都乱掉。
后来才发现,vim里有一个这样的命令来解决这个问题。

1
:set paste

进入粘贴模式,这个时候缩进不再起作用。复制粘贴完之后。

1
:set nopaste

回到正常模式。
粘贴模式是为了让vim区分用户键盘打入的内容与粘贴内容的区别。

GitHub Blog启程了

好久没有写博客了,原因是自己太懒,没有总结落实成文字的习惯。以前一直用的csdn,写过一些文章,也转过一些文章,后来由于懒,就没再更新。现在决定要开始写些东西了,就索性转到github上来好了,也学一些Markdown!

下面记一下博客搭建过程:

GitHub

用GitHub很久了,找些开源库,写些小项目什么的,工作中也一直用git来做版本管理,因此这些先略过不表

Hexo框架

Hexo是一个快速、简洁且高效的博客框架。支持Markdown解析文章,因此就选了Hexo

安装

这之前需要先安装Node.js

1
2
npm install -g hexo-cli
npm install hexo --save

初始化配置

安装好后,进入博客根目录,执行以下命令

1
hexo init

本地调试

执行以下命令,成功后按说明在浏览器中打开

1
hexo server

Hexo简写命令

1
2
3
hexo n #new
hexo g #generate
hexo s #server

本地设置

打开_config.yml,设置发布方式

1
2
deploy:
type: git

在GitHub创建一个项目xxx.github.io

用git clone 到本地

部署静态网页

到本地的xxx.github.io的根目录下,执行

1
2
hexo g
hexo d