(727) 342-5762

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8"  language="java" %>

<html>

<head>

    <title>跨域测试</title>

    <script src="js/jquery-1.7.2.js"></script>

    <script>

        /回调函数

        function showData (result) {

            var data = JSON.stringify(result); /json对象转成字符串

            $("#text").val(data);

        }


        $(document).ready(function () {


            $("#btn").click(function () {

                /向头部输入一个脚本,该脚本发起一个跨域请求

                $("head").append("<script src='/localhost:9090/student?callback=showData'><\/script>");

            });


        });

    </script>

</head>

<body>

    <input id="btn" type="button" value="跨域获取数据" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>


</body>

</html>


服务端:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setCharacterEncoding("UTF-8");

    response.setContentType("text/html;charset=UTF-8");


    /数据

    List<Student> studentList = getStudentList();



    JSONArray jsonArray = JSONArray.fromObject(studentList);

    String result = jsonArray.toString();


    /前端传过来的回调函数名称

    String callback = request.getParameter("callback");

    /用回调函数名称包裹返回数据,这样,返回数据就作为回调函数的参数传回去了

    result = callback + "(" + result + ")";


    response.getWriter().write(result);

}


结果:

 

4、再来看jquery的jsonp方式跨域请求:

服务端代码不变,js代码如下:最简单的方式,只需配置一个dataType:'jsonp',就可以发起一个跨域请求。jsonp指定服务器返回的数据类型为jsonp格式,可以看发起的请求路径,自动带了一个callback=xxx,xxx是jquery随机生成的一个回调函数名称。

这里的success就跟上面的showData一样,如果有success函数则默认success()作为回调函数。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8"  language="java" %>

<html>

<head>

    <title>跨域测试</title>

    <script src="js/jquery-1.7.2.js"></script>

    <script>


        $(document).ready(function () {


            $("#btn").click(function () {


                $.ajax({

                    url: "/localhost:9090/student",

                    type: "GET",

                    dataType: "jsonp", /指定服务器返回的数据类型

                    success: function (data) {

                        var result = JSON.stringify(data); /json对象转成字符串

                        $("#text").val(result);

                    }

                });


            });


        });

    </script>

</head>

<body>

    <input id="btn" type="button" value="跨域获取数据" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>


</body>

</html>


效果:

 

再看看如何指定特定的回调函数:第30行代码

  回调函数你可以写到<script>下(默认属于window对象),或者指明写到window对象里,看jquery源码,可以看到jsonp调用回调函数时,是调用的window.callback。

  然后看调用结果,发现,请求时带的参数是:callback=showData;调用回调函数的时候,先调用了指定的showData,然后再调用了success。所以,success是返回成功后必定会调用的函数,就看你怎么写了。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8"  language="java" %>

<html>

<head>

    <title>跨域测试</title>

    <script src="js/jquery-1.7.2.js"></script>

    <script>


        function showData (data) {

            console.info("调用showData");


            var result = JSON.stringify(data);

            $("#text").val(result);

        }


        $(document).ready(function () {


/            window.showData = function  (data) {

/                console.info("调用showData");

/

/                var result = JSON.stringify(data);

/                $("#text").val(result);

/            }


            $("#btn").click(function () {


                $.ajax({

                    url: "/localhost:9090/student",

                    type: "GET",

                    dataType: "jsonp",  /指定服务器返回的数据类型

                    jsonpCallback: "showData",  /指定回调函数名称

                    success: function (data) {

                        console.info("调用success");

                    }

                });

            });


        });

    </script>

</head>

<body>

    <input id="btn" type="button" value="跨域获取数据" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>


</body>

</html>


效果图:

 

再看看如何改变callback这个名称:第23行代码

  指定callback这个名称后,后台也需要跟着更改。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8"  language="java" %>

<html>

<head>

    <title>跨域测试</title>

    <script src="js/jquery-1.7.2.js"></script>

    <script>


        function showData (data) {

            console.info("调用showData");


            var result = JSON.stringify(data);

            $("#text").val(result);

        }


        $(document).ready(function () {


            $("#btn").click(function () {


                $.ajax({

                    url: "/localhost:9090/student",

                    type: "GET",

                    dataType: "jsonp",  /指定服务器返回的数据类型

                    jsonp: "theFunction",   /指定参数名称

                    jsonpCallback: "showData",  /指定回调函数名称

                    success: function (data) {

                        console.info("调用success");

                    }

                });

            });


        });

    </script>

</head>

<body>

    <input id="btn" type="button" value="跨域获取数据" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>


</body>

</html>


后台代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setCharacterEncoding("UTF-8");

    response.setContentType("text/html;charset=UTF-8");


    /数据

    List<Student> studentList = getStudentList();



    JSONArray jsonArray = JSONArray.fromObject(studentList);

    String result = jsonArray.toString();


    /前端传过来的回调函数名称

    String callback = request.getParameter("theFunction");

    /用回调函数名称包裹返回数据,这样,返回数据就作为回调函数的参数传回去了

    result = callback + "(" + result + ")";


    response.getWriter().write(result);

}


效果图:

 

最后看看jsonp是否支持POST方式:ajax请求指定POST方式

  可以看到,jsonp方式不支持POST方式跨域请求,就算指定成POST方式,会自动转为GET方式;而后端如果设置成POST方式了,那就请求不了了。

  jsonp的实现方式其实就是<script>脚本请求地址的方式一样,只是ajax的jsonp对其做了封装,所以可想而知,jsonp是不支持POST方式的。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8"  language="java" %>

<html>

<head>

    <title>跨域测试</title>

    <script src="js/jquery-1.7.2.js"></script>

    <script>


        $(document).ready(function () {


            $("#btn").click(function () {


                $.ajax({

                    url: "/localhost:9090/student",

                    type: "POST",   /post请求方式

                    dataType: "jsonp",

                    jsonp: "callback",

                    success: function (data) {

                        var result = JSON.stringify(data);

                        $("#text").val(result);

                    }

                });

            });


        });

    </script>

</head>

<body>

    <input id="btn" type="button" value="跨域获取数据" />

    <textarea id="text" style="width: 400px; height: 100px;"></textarea>

</body>

</html>


效果图:

 

再补充一点,回到第一条:CORS头缺少“Access-Control-Allow-Origin”。

  有时候你会发现其它都没问题,出现这个错误:这个错误代表服务端拒绝跨域访问。如果出现这个错误,就需要在服务端设置允许跨域请求。

  response.setHeader("Access-Control-Allow-Origin", "*"); 设置允许任何域名跨域访问

 

 è®¾ç½®å¯ä»¥è·¨åŸŸè®¿é—®ï¼šç¬¬6行代码或第8行代码,设置其中一个即可。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setCharacterEncoding("UTF-8");

    response.setContentType("text/html;charset=UTF-8");


    / * 表示允许任何域名跨域访问

    response.setHeader("Access-Control-Allow-Origin", "*");

    / 指定特定域名可以访问

    response.setHeader("Access-Control-Allow-Origin", "localhost:8080/");


    /数据

    List<Student> studentList = getStudentList();


    JSONArray jsonArray = JSONArray.fromObject(studentList);

    String result = jsonArray.toString();


    /前端传过来的回调函数名称

    String callback = request.getParameter("callback");

    /用回调函数名称包裹返回数据,这样,返回数据就作为回调函数的参数传回去了

    result = callback + "(" + result + ")";


    response.getWriter().write(result);

}

 

总结:jQuery ajax方式以jsonp类型发起跨域请求,其原理跟<script>脚本请求一样,因此使用jsonp时也只能使用GET方式发起跨域请求。跨域请求需要服务端配合,设置callback,才能完成跨域请求。 

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


tutin

js如何获取response header信息, 用sessionstatus=XMLHttpRequest.getResponseHeader("sessionStatus"); 获取到的为null。

麻烦大侠们看看怎么解决,截图如下:

clipboard.png

clipboard.png




var req = new XMLHttpRequest();req.open('GET', document.location, false);req.send(null);var headers = req.getAllResponseHeaders().toLowerCase();alert(headers);
  • 2017å¹´06月26日回答

  • 2 评论

  • 赞赏

  • 编辑

caiyongji2.7k 声望

答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问

看你写成了全小写、sessionStatus、写成驼峰试一下、

  • 2017å¹´06月26日回答

  • 3 评论

  • 赞赏

  • 编辑

liujians2.5k 声望

答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问

var xmlhttp;

xmlhttp = null;if (window.XMLHttpRequest) {  / code for Firefox, Mozilla, IE7, etc.
  xmlhttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {  / code for IE6, IE5
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}if (xmlhttp != null) {
  xmlhttp.onreadystatechange = function() {    if (xmlhttp.readyState == 4) {      / 4 = "loaded"
      if (xmlhttp.status == 200) {        / 200 = "OK
        alert(xmlhttp.getAllResponseHeaders());
      } else {
        alert("Problem retrieving data:" + xmlhttp.statusText);
      }
    }
  };
  xmlhttp.open("GET", document.location.href, true);
  xmlhttp.send(null);
} else {
  alert("Your browser does not support XMLHTTP.");
}


715-287-3245
2018-07-09

2073266309家族的习惯(包括C, (438) 883-2051, trisome, Java, JavaScript, 323-913-4651, 2627929913等)。这些特性使JSON成为理想的数据交换语言。

JSON构建的结构:

在JSON中,有两种结构:对象和数组。

1. â€œåç§°/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),9567840778(dictionary),(985) 493-2946(hash table),有键列表(keyed list),或者关联bullet compass ï¼ˆassociative array)。

一个对象以“{”开始,“}”结束。每个“key”后跟一“:”,“‘key/value’ 对”之间运用 “,”分隔。

packJson = {"name":"nikita", "password":"1111"}

2. å€¼çš„有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
  这些都是常见的8882565507。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

packJson = [{"name":"nikita", "password":"1111"}, {"name":"tony", "password":"2222"}];

数组是值的有序集合。一个数组以“[”开始,“]”结束。值之间运用 “,”分隔。

二、JSON对象和JSON字符串的转换

为了方便地处理JSON数据,JSON提供了json.js包,下载地址:405-227-0533

在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键。例如:

JSON字符串:

var jsonStr = '{"name":"nikita", "password":"1111"}';

JSON对象:

var jsonObj = {"name":"nikita", "password":"1111"};

1、JSON对象转换为JSON字符串

function json2str(o){

    var arr = [];

    var fmt = function(s) {

       if (typeof s == 'object' && s != null) {

           return json2str(s); /递归

       }

      /如果是数字或string

       return /^(string|number)$/.test(typeof s) ? "'" + s + "'" : s;

    }


    if(o.constructor === Array ){/数组

       for ( var i in o) {

           arr.push(fmt(o[i]));

       }

       return '[' + arr.join(',') + ']';

    } else{/普通JSON对象

       for ( var i in o) {

           arr.push("'" + i + "':" + fmt(o[i]));

    }

    return '{' + arr.join(',') + '}';

   }

}

可以使用toJSONString()或者全局方法JSON.stringify()将JSON对象转化为JSON字符串。

 var last = jsonObj.toJSONString(); /将JSON对象转化为JSON字符

 æˆ–者

var last = JSON.stringify(jsonObj);   /将JSON对象转化为JSON字符

注意:
    ä¸Šé¢çš„几个方法中,除了
eval()函数是js自带的之外,其他的几个方法都来自json.js包。新版本的 JSON ä¿®æ”¹äº† API,将 JSON.stringify() å’Œ JSON.parse() ä¸¤ä¸ªæ–¹æ³•éƒ½æ³¨å…¥åˆ°äº† Javascript çš„内建对象里面,前者变成了Object.toJSONString(),而后者变成了 String.parseJSON()。如果提示找不到toJSONString()和parseJSON()方法,则说明您的json包版本太低。

2、JSON字符串转换为Json对象

var myObject = eval('('+jsonStr+')');

 eval是js自带的函数,不是很安全,可以考虑用json包。

 æˆ–者

var myObject = jsonStr.parseJSON();   /由JSON字符串转换为JSON对象

 æˆ–者

var myObject = JSON.parse(jsonStr);   /由JSON字符串转换为JSON对象

然后,就可以这样读取:

Alert(myObject.name);

Alert(myObject.password);

特别注意:如果myObject本来就是一个JSON对象,那么使用eval()函数转换后(哪怕是多次转换)还是JSON对象,但是使用parseJSON()函数处理后会有问题(抛出语法异常)。

三、遍历JSON对象

myJson = {"name":"nikita", "password":"1111"};for(var p in myJson){
/遍历json对象的每个key/value对,p为key
   alert(p + " " + myJson[p]);
}

四、遍历JSON数组

复制代码

packJson = [
    {"name":"nikita", "password":"1111"},
    {"name":"tony", "password":"2222"}
];for(var p in packJson){
/遍历json数组时,这么写p为索引,0,1
   alert(packJson[p].name + " " + packJson[p].password);
}

复制代码

我更倾向于这种写法:

for(var i = 0; i < packJson.length; i++){
   alert(packJson[i].name + " " + packJson[i].password);
}

五、将两个JSON对象组装到一个里面

复制代码

/targetJson ç›®æ ‡JSON,packJson è¢«ç»„装JSONfunction addGroupJson(targetJson, packJson){    if(targetJson && packJson){       for(var p in packJson){
           targetJson[p] = packJson[p];
       }
    }
}

复制代码

用法如下:

var json1 = {"name":"nikita"};var json2 = {"password":"1111"};
addGroupJson(json1, json2);
alert(json2str(json1));

 å…­ã€JS 实现Json查询方法

前一部分是简单的实现如何使用JS写模板,第二个就是具体的实现了JSON查询的一个扩展。

/* å®šä¹‰æ¨¡æ¿å‡½æ•° */
        var template = function (queryArr) {            var count = 0;            for (var i = 0; i < queryArr.length; i++) {                var e = queryArr[i];                if ($express) {
                    count++;
                }
            }            return count;
        }        /*模板创建函数 */       
        var createIntance = function (exp) {            var fun = template.toString().replace("$express", exp).toString();            return eval("0," + fun);
        }        var testTodo = function () {            var testArr = [
                { name: "张三", age: 20 },
                { name: "李四", age: 25 },
                { name: "王二麻子", age: 28 },
                { name: "小张", age: 30 }
            ];            var func = createIntance("e.age>=25");
            alert(func(testArr));
        }        /****************** JS å®žçŽ° JSON查询 **********************/        
        / å®šä¹‰å¸¸ç”¨çš„函数
        var len = function (s) { return s.length; }        var left = function (s, n) { return s.substr(0, n); }        var right = function (s, n) { return s.substr(-n); }        var index = function (s, find) { return s.indexOf(find) + 1; }        / æ‰©å±•åŽŸåž‹æ–¹æ³•
        var _proto = Object.prototype;        / ç¼“å­˜,解决快速查找
        var _cache = {};        / æ‰©å±•è¿ç®—符
        var _alias = [            /@/g, "_e.",            /AND/gi, "&&",            /OR/gi, "||",            /<>/g, "!=",            /NOT/gi, "!",            /([^=<>])=([^=]|$)/g, '$1==$2'
        ];        var _rQuote = /""/g;        var _rQuoteTemp = /!~/g;        / ç¼–译
        var _complite = function (code) {            return eval("0," + code);
        }        / å°†æ‰©å±•ç¬¦å·è½¬æ¢æˆæ ‡å‡†çš„JS符号
        var _interpret = function (exp) {
            exp = exp.replace(_rQuote,"!~");            var arr = exp.split('"');            var i, n = arr.length;            var k = _alias.length;            for (var i = 0; i < n; i += 2) {                var s = arr[i];                for (var j = 0; j < k; j += 2) {                    if (index(s, _alias[j]) > -1) {
                        s = s.replace(_alias[j], _alias[j + 1]);
                    }
                }
                arr[i] = s;
            }            for (var i = 1; i < n; i += 2) {
                arr[i] = arr[i].replace(_rQuoteTemp, '\\"');
            }            return arr.join('"');
        }        / å®šä¹‰æ¨¡å‡½æ•°
        var _templ = function (_list) {            var _ret = [];            var _i = -1;            for (var _k in _list) {                var _e = _list[_k];                if (_e != _proto[_k]) {                    if ($C) {
                        _ret[++_i] = _e;
                    }
                }
            }            return _ret;
        } .toString();        / æ‰©å±•æŸ¥è¯¢çš„方法
        _proto.Query = function (exp) {            if (!exp) {                return [];
            }            var fn = _cache[exp];            try {                if (!fn) {                    var code = _interpret(exp);
                    code = _templ.replace("$C", code);
                    fn = _cache[exp] = _complite(code);
                }                return fn(this);
            } catch (e) {                return [];
            }
        }        var doTest = function () {            var heros = [            / å============攻=====防=======力量====敏捷=====智力====
                {name: '冰室女巫', DP: 38, AP: 1.3, Str: 16, Dex: 16, Int: 21 },
                { name: '沉默术士', DP: 39, AP: 1.1, Str: 17, Dex: 16, Int: 21 },
                { name: '娜迦海妖', DP: 51, AP: 6.0, Str: 21, Dex: 21, Int: 18 },
                { name: '赏金猎人', DP: 39, AP: 4.0, Str: 17, Dex: 21, Int: 16 },
                { name: '剧毒术士', DP: 45, AP: 3.1, Str: 18, Dex: 22, Int: 15 },
                { name: '光之守卫', DP: 38, AP: 1.1, Str: 16, Dex: 15, Int: 22 },
                { name: '炼金术士', DP: 49, AP: 0.6, Str: 25, Dex: 11, Int: 25 }            /...            ];            var match = heros.Query('@Str>20 AND @Dex>20');
            ShowResult(match[0]);            
            / æŸ¥è¯¢ï¼šâ€œå£«â€ç»“尾的
            / ç»“果:沉默术士,剧毒术士,炼金术士
            var match = heros.Query('right(@name,1)="士"');
            ShowResult(match[0]);
        }        function ShowResult(result) {
            alert(result.name + " " + result.DP + " " + result.AP + " " + result.Str + " " + result.Dex + " " + result.Int);
        }


626-420-7231

搭建或配置网络环境时,经常会使用ping命令检查网络是否可达。有些时候Ping命令也不好使,比如因防火墙禁止或访问策略限制等。则可使用telnet测试映射端口或远程访问主机。

     Telnet协议是TCP/IP协议族的其中之一,是Internet远程登录服务的标准协议和主要方式,常用于网页服务器的远程控制,可供使用者在本地主机运行远程主机上的工作。 

下面有小河给大家分享:

1、 å¦‚何在windows环境上配置Telnet?(可解决:"telnet不是内部或外部命令"问题)

(1)在win7&win8系统上配置Telnet。

(2)在windows server 2008服务器系统上配置Telnet。

2、 å¦‚何使用telnet测试端口?

(1)telnet IP ç«¯å£ã€‚

(2)telnet åŸŸå ç«¯å£ã€‚

3、 å¦‚何使用telnet远程访问其他主机?

  • 1.1、在win7&win8系统上配置Telnet服务。

    1.1.1、win7上添加Telnet服务。

    操作过程:点击"开始"→"控制器面板"→" æŸ¥çœ‹æ–¹å¼ï¼šç±»åž‹"则点击"程序"("查看方式:大图标"则点击"程序和功能")→ "启动或关闭windows功能"→ åœ¨"Windows功能"界面勾选Telnet服务器和客户端 â†’最后点击"确定"等待安装。

    telnet配置和telnet用法

  • 1.1.2 ã€win7上配置Telnet为自动并开启服务。

    (1)右击"计算机"→点击"管理"→ å±•å¼€"服务和应用程序"→点击"服务"→右击"Telnet服务",在其菜单栏中点击"属性"→将"启动类型"设置为"自动"→点击"确定"完成启动类型设置。

    (2)再次右击Telnet服务,在其菜单栏中点击"启动"完成Telnet服务启动。

    telnet配置和telnet用法

  • 1.1.3、检验Telnet服务是否成功安装和启动。

    (1)在命令提示符中输入:telnet -help,显示如下图即解决"telnet不是内部或外部命令"。

    (2)在命令提示符中输入:telnet 127.0.0.1,显示如下图即Telnet服务启动成功。

    telnet配置和telnet用法

  • 1.2、在windows server 2008 R2系统上配置Telnet服务。

    1.2.1、进入windows server的"服务器管理器"界面。

    操作过程:右击桌面"计算机"→ ç‚¹å‡»"管理"→进入"服务器管理器"界面。

    或通过"开始"→"控制器面板"→"查看方式:类型"则点击"程序"("查看方式:大图标"则点击"程序和功能")→"打开或关闭windows程序"→进入"服务器管理器"界面。

    telnet配置和telnet用法

  • 1.2.2、windows server系统上添加Telnet服务。

    操作过程:点击"功能"→"添加功能"→勾选Telnet服务器与客户端→"下一步"→"安装"→等待安装结束后点击"关闭",完成Telnet服务添加。

    334-621-6798

  • 1.2.3、windows server系统上配置Telnet为自动并启动服务。

    操作过程:

    (1)在服务器管理器界面点击"配置"→"服务"→右击"Telnet服务"在其菜单栏中点击"属性"→将"启动类型"设置为"自动"→点击"确定"完成启动类型设置。

    (2)再次右击Telnet服务,在其菜单栏中点击"启动"完成Telnet服务启动。

    478-788-6923

  • 1.2.4、检验Telnet服务是否开启。

    命令提示符中输入:telnet 127.0.0.1,显示如下图即Telnet服务启动成功。

    954-980-4493

  • 2、使用Telnet测试端口。

    2.1、telnet IP ç«¯å£ï¼Œï¼ˆé˜²ç«å¢™ä¸ºåšç›¸åº”限制)。

    (1)如测本机主机:telnet 127.0.0.1 80或23,结果显示其80端口不可用,23端口开启可用。

    (2)如测其它主机:telnet 10.0.0.27 80或21,结果显示其80端口不可用,21端口开启可用。

    注:10.0.0.27主机是本人用于做测试的另一台主机。

    Telnet IP端口显示:连接失败则是端口不可用或被禁止。

    若telnet IP端口可用则会进入某个界面,界面因端口不同而显示不同。

    (814) 214-8349

    (605) 809-5476

  • 2.2、telnet åŸŸå ç«¯å£ã€‚

    以"百度"为例,21是FTP服务端口一般不会开启,而80是HTTP端口故此肯定开启。

    telnet配置和telnet用法

  • 3、使用telnet远程访问某主机。

    背景介绍:若使用Telnet协议远程访问主机,其访问主机和被访问主机都必须安装相应Telnet服务,被访问主机需将用户组中某个用户添加为隶属于TelnetClinets组,其访问主机输入用户名和密码才可访问被访问主机。

    3.1、在被访问主机上添加某个用户隶属于TelnetClients组。

    操作过程:右击桌面"计算机"→"管理"→"系统工具--本地用户和组--用户"→右击用户在其菜单栏中点击"属性"→"隶属于--添加"→在"输入对象名称来选择(示例)"中输入"TelnetClients"→最后依次"确定"。

    (669) 277-0607

    972-301-5990

  • 3.2、ping被访问主机的IP,检测网络是否正常。如:ping 10.0.0.31。

    579-787-6495

  • 3.3、网络正常时Telnet IP发起远程访问主机。

    输入:telnet 10.0.0.31敲回车;

    进入Telnet Client客户端界面,问"您想发送吗(y/n):"输入y敲回车;

    进入Telnet Service服务界面,输入(被访问主机)用户名和密码敲回车;

    最后进入被访问主机的命令提示符目录下,即成功使用Telnet远程访问主机。

    telnet配置和telnet用法



阅读全文
用mv命令
1.作用
mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令等同于DOS系统下的ren和move命令的组合。它的使用权限是所有用户。
2.格式
mv [options] æºæ–‡ä»¶æˆ–目录 ç›®æ ‡æ–‡ä»¶æˆ–目录
3.[options]主要参数
-i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答”y”或”n”,这样可以避免误覆盖文件。
-f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。
4.第二个参数
当第二个参数类型是文件时,mv命令完成文件重命名,它将所给的源文件或目录重命名为给定的目标文件名。
当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有,而链至该文件的链接也将丢失。
5.应用实例
(1)将/usr/udt中的所有文件移到(用”.”表示)中:
$ mv /usr/udt/* .
(2)将文件test.txt重命名为wbk.txt:
$ mv test.txt wbk.txt

(3)把的一个子目录里的文件移动到另一个子目录里

       mv  æ–‡ä»¶å/*  å¦ä¸€ä¸ªç›®å½•

(4)移动当前文件夹下的所有文件到上

       mv * ../

cp命令是用于复制的。
cp(copy) 复制文件或目录。
cp参数:
-a或–archive  此参数的效果和同时指定”-dpR”参数相同。
-b或–backup  删除,覆盖目标文件之前的备份,备份文件会在字尾加上一个备份字符串。
-d或–no-dereference  当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录。
-f或–force  强行复制文件或目录,不论目标文件或目录是否已存在。
-i或–interactive  覆盖既有文件之前先询问用户。
-l或–link  对源文件建立硬连接,而非复制文件。
-p或–preserve  保留源文件或目录的属性。
-P或–parents  保留源文件或目录的路径。
-r  递归处理,将指定目录下的文件与子目录一并处理。
-R或–recursive  递归处理,将指定目录下的所有文件与子目录一并处理。
-s或–symbolic-link  对源文件建立符号连接,而非复制文件。
-S<备份字尾字符串>或–suffix=<备份字尾字符串>  用”-b”参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字尾字符串是符号”~”。
-u或–update  使用这项参数后只会在源文件的更改时间较目标文件更新时或是 名称相互对应的目标文件并不存在,才复制文件。
-v或–verbose  显示指令执行过程。
-V<备份方式>或–version-control=<备份方式>  用”-b”参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这字符串不仅可用”-S”参数变更,当使用”-V”参数指定不同备份方式时,也会产生不同字尾的备份字串。
-x或–one-file-system  复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不予复制。
–help  在线帮助。
–sparse=<使用时机>  设置保存稀疏文件的时机。
–version  显示版本信息。


248-290-3986
2018-06-27

什么是跨域?

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。

广义的跨域:

1.) èµ„源跳转: A链接、重定向、表单提交
2.) èµ„源嵌入: <link>、<script>、<img>、<frame>等dom标签,还有样式中background:url()、@font-face()等文件外链
3.) è„šæœ¬è¯·æ±‚: js发起的ajax请求、dom和js对象的跨域操作等

其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景。

什么是同源策略?
同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

同源策略限制以下几种行为:

1.) Cookie、LocalStorage å’Œ IndexDB æ— æ³•è¯»å–2.) DOM å’Œ Js对象无法获得3.) AJAX è¯·æ±‚不能发送

常见跨域场景

URL                                      è¯´æ˜Ž                    æ˜¯å¦å…è®¸é€šä¿¡/www.domain.com/a.js/www.domain.com/b.js         åŒä¸€åŸŸåï¼Œä¸åŒæ–‡ä»¶æˆ–路径           å…è®¸/www.domain.com/lab/c.js/www.domain.com:8000/a.js/www.domain.com/b.js         åŒä¸€åŸŸåï¼Œä¸åŒç«¯å£                ä¸å…è®¸ /www.domain.com/a.js/www.domain.com/b.js        åŒä¸€åŸŸåï¼Œä¸åŒåè®®                ä¸å…è®¸ /www.domain.com/a.js/192.168.4.12/b.js           åŸŸåå’ŒåŸŸåå¯¹åº”相同ip              ä¸å…è®¸ /www.domain.com/a.js/x.domain.com/b.js           ä¸»åŸŸç›¸åŒï¼Œå­åŸŸä¸åŒ                ä¸å…è®¸/domain.com/c.js /www.domain1.com/a.js/www.domain2.com/b.js        ä¸åŒåŸŸå                         ä¸å…è®¸

跨域解决方案

1、 通过jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域资源共享(CORS)
7、 nginx代理跨域
8、 nodejs中间件代理跨域
9、 WebSocket协议跨域

一、 通过jsonp跨域

通常为了减轻web服务器的负载,我们把js、css,img等静态资源分离到另一台独立域名的服务器上,在html页面中再通过相应的标签从不同域名下加载静态资源,而被浏览器允许,基于此原理,我们可以通过动态创建script,再请求一个带参网址实现跨域通信。

1.)原生实现:

 <script>
    var script = document.createElement('script');
    script.type = 'text/javascript';    / ä¼ å‚并指定回调执行函数为onBack
    script.src = '/www.domain2.com:8080/login?user=admin&callback=onBack';    document.head.appendChild(script);    / å›žè°ƒæ‰§è¡Œå‡½æ•°
    function onBack(res) {
        alert(JSON.stringify(res));
    } </script>

服务端返回如下(返回时即执行全局函数):

onBack({"status": true, "user": "admin"})

2.)jquery ajax:

$.ajax({    url: '/www.domain2.com:8080/login',    type: 'get',    dataType: 'jsonp',  / è¯·æ±‚方式为jsonp
    jsonpCallback: "onBack",    / è‡ªå®šä¹‰å›žè°ƒå‡½æ•°å
    data: {}
});

3.)vue.js:

this.$http.jsonp('/www.domain2.com:8080/login', {    params: {},    jsonp: 'onBack'
}).then((res) => {    console.log(res); 
})

后端node.js代码示例:

var querystring = require('querystring');var http = require('http');var server = http.createServer();

server.on('request', function(req, res) {    var params = qs.parse(req.url.split('?')[1]);    var fn = params.callback;    / jsonp返回设置
    res.writeHead(200, { 'Content-Type': 'text/javascript' });
    res.write(fn + '(' + JSON.stringify(params) + ')');

    res.end();
});

server.listen('8080');console.log('Server is running at port 8080...');

jsonp缺点:只能实现get一种请求。

二、 document.domain + iframe跨域

此方案仅限主域相同,子域不同的跨域应用场景。

实现原理:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。

1.)父窗口:(www.domain.com/a.html)

<iframe id="iframe" src="/child.domain.com/b.html"></iframe><script>
    document.domain = 'domain.com';    var user = 'admin';</script>

2.)子窗口:(child.domain.com/b.html)

<script>
    document.domain = 'domain.com';    / èŽ·å–父窗口中变量
    alert('get js data from parent ---> ' + window.parent.user);</script>

三、 location.hash + iframe跨域

实现原理: a欲与b跨域相互通信,通过中间页c来实现。 三个页面,不同域之间利用iframe的location.hash传值,相同域之间直接js访问来通信。

具体实现:A域:a.html -> B域:b.html -> A域:c.html,a与b不同域只能通过hash值单向通信,b与c也不同域也只能单向通信,但c与a同域,所以c可通过parent.parent访问a页面所有对象。

1.)a.html:(www.domain1.com/a.html)

<iframe id="iframe" src="/www.domain2.com/b.html" style="display:none;"></iframe><script>
    var iframe = document.getElementById('iframe');    / å‘b.htmlä¼ hash值
    setTimeout(function() {
        iframe.src = iframe.src + '#user=admin';
    }, 1000);    
    / å¼€æ”¾ç»™åŒåŸŸc.html的回调方法
    function onCallback(res) {
        alert('data from c.html ---> ' + res);
    }</script>

2.)b.html:(www.domain2.com/b.html)

<iframe id="iframe" src="/www.domain1.com/c.html" style="display:none;"></iframe><script>
    var iframe = document.getElementById('iframe');    / ç›‘听a.html传来的hash值,再传给c.html
    window.onhashchange = function () {
        iframe.src = iframe.src + location.hash;
    };</script>

3.)c.html:(3132873695

<script>
    / ç›‘听b.html传来的hash值
    window.onhashchange = function () {        / å†é€šè¿‡æ“ä½œåŒåŸŸa.html的js回调,将结果传回
        window.parent.parent.onCallback('hello: ' + location.hash.replace('#user=', ''));
    };</script>

四、 window.name + iframe跨域

window.name属性的独特之处:name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值(2MB)。

1.)a.html:(9519563119

var proxy = function(url, callback) {    var state = 0;    var iframe = document.createElement('iframe');    / åŠ è½½è·¨åŸŸé¡µé¢
    iframe.src = url;    / onload事件会触发2次,第1次加载跨域页,并留存数据于window.name
    iframe.onload = function() {        if (state === 1) {            / ç¬¬2次onload(同域proxy页)成功后,读取同域window.name中数据
            callback(iframe.contentWindow.name);
            destoryFrame();

        } else if (state === 0) {            / ç¬¬1次onload(跨域页)成功后,切换到同域代理页面
            iframe.contentWindow.location = '/www.domain1.com/proxy.html';
            state = 1;
        }
    };    document.body.appendChild(iframe);    / èŽ·å–数据以后销毁这个iframe,释放内存;这也保证了安全(不被其他域frame js访问)    function destoryFrame() {
        iframe.contentWindow.document.write('');
        iframe.contentWindow.close();        document.body.removeChild(iframe);
    }
};/ è¯·æ±‚跨域b页面数据
proxy('/www.domain2.com/b.html', function(data){
    alert(data);
});

2.)proxy.html:(www.domain1.com/proxy....
中间代理页,与a.html同域,内容为空即可。

3.)b.html:((601) 646-7868

<script>
    window.name = 'This is domain2 data!';</script>

总结:通过iframe的src属性由外域转向本地域,跨域数据即由iframe的window.name从外域传递到本地域。这个就巧妙地绕过了浏览器的跨域访问限制,但同时它又是安全操作。

五、 postMessage跨域

postMessage是HTML5 XMLHttpRequest Level 2中的API,且是为数不多可以跨域操作的window属性之一,它可用于解决以下方面的问题:
a.) 页面和其打开的新窗口的数据传递
b.) 多窗口之间消息传递
c.) 页面与嵌套的iframe消息传递
d.) 上面三个场景的跨域数据传递

用法:postMessage(data,origin)方法接受两个参数
data: html5规范支持任意基本类型或可复制的对象,但部分浏览器只支持字符串,所以传参时最好用JSON.stringify()序列化。
origin: 协议+主机+端口号,也可以设置为"*",表示可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。

1.)a.html:(portague

<iframe id="iframe" src="/www.domain2.com/b.html" style="display:none;"></iframe><script>       
    var iframe = document.getElementById('iframe');
    iframe.onload = function() {        var data = {            name: 'aym'
        };        / å‘domain2传送跨域数据
        iframe.contentWindow.postMessage(JSON.stringify(data), '/www.domain2.com');
    };    / æŽ¥å—domain2返回数据
    window.addEventListener('message', function(e) {
        alert('data from domain2 ---> ' + e.data);
    }, false);</script>

2.)b.html:(www.domain2.com/b.html)

<script>
    / æŽ¥æ”¶domain1的数据
    window.addEventListener('message', function(e) {
        alert('data from domain1 ---> ' + e.data);        var data = JSON.parse(e.data);        if (data) {
            data.number = 16;            / å¤„理后再发回domain1
            window.parent.postMessage(JSON.stringify(data), '/www.domain1.com');
        }
    }, false);</script>

六、 跨域资源共享(CORS)

普通跨域请求:只服务端设置Access-Control-Allow-Origin即可,前端无须设置。
带cookie请求:前后端都需要设置字段,另外需注意:所带cookie为跨域请求接口所在域的cookie,而非当前页。
目前,所有浏览器都支持该功能(IE8+:IE8/9需要使用XDomainRequest对象来支持CORS)),CORS也已经成为主流的跨域解决方案。

1、 前端设置:

1.)原生ajax

/ å‰ç«¯è®¾ç½®æ˜¯å¦å¸¦cookie
xhr.withCredentials = true;

示例代码:

var xhr = new XMLHttpRequest(); / IE8/9需用window.XDomainRequest兼容/ å‰ç«¯è®¾ç½®æ˜¯å¦å¸¦cookie
xhr.withCredentials = true;

xhr.open('post', '/www.domain2.com:8080/login', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('user=admin');

xhr.onreadystatechange = function() {    if (xhr.readyState == 4 && xhr.status == 200) {
        alert(xhr.responseText);
    }
};

2.)jQuery ajax

$.ajax({
    ...
   xhrFields: {
       withCredentials: true    / å‰ç«¯è®¾ç½®æ˜¯å¦å¸¦cookie
   },
   crossDomain: true,   / ä¼šè®©è¯·æ±‚头中包含跨域的额外信息,但不会含cookie
    ...
});

3.)vue框架在vue-resource封装的ajax组件中加入以下代码:

Vue.http.options.credentials = true
2、 服务端设置:

若后端设置成功,前端浏览器控制台则不会出现跨域报错信息,反之,说明没设成功。

1.)Java后台:

/*
 * å¯¼å…¥åŒ…:import javax.servlet.http.HttpServletResponse;
 * æŽ¥å£å‚数中定义:HttpServletResponse response
 */
response.setHeader("Access-Control-Allow-Origin", "/www.domain1.com");  / è‹¥æœ‰ç«¯å£éœ€å†™å…¨ï¼ˆåè®®+域名+端口)
response.setHeader("Access-Control-Allow-Credentials", "true");

2.)Nodejs后台示例:

var http = require('http');var server = http.createServer();var qs = require('querystring');

server.on('request', function(req, res) {    var postData = '';    / æ•°æ®å—接收中
    req.addListener('data', function(chunk) {
        postData += chunk;
    });    / æ•°æ®æŽ¥æ”¶å®Œæ¯•
    req.addListener('end', function() {
        postData = qs.parse(postData);        / è·¨åŸŸåŽå°è®¾ç½®
        res.writeHead(200, {            'Access-Control-Allow-Credentials': 'true',     / åŽç«¯å…è®¸å‘送Cookie            'Access-Control-Allow-Origin': '/www.domain1.com',    / å…è®¸è®¿é—®çš„域(协议+域名+端口)            'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly'   / HttpOnly:脚本无法读取cookie
        });

        res.write(JSON.stringify(postData));
        res.end();
    });
});

server.listen('8080');console.log('Server is running at port 8080...');

七、 nginx代理跨域

1、 nginx配置解决iconfont跨域

浏览器跨域访问js、css、img等常规静态资源被同源策略许可,但iconfont字体文件(eot|otf|ttf|woff|svg)例外,此时可在nginx的静态资源服务器中加入以下配置。

location / {  add_header Access-Control-Allow-Origin *;
}
2、 nginx反向代理接口跨域

跨域原理: 同源策略是浏览器的安全策略,不是HTTP协议的一部分。服务器端调用HTTP接口只是使用HTTP协议,不会执行JS脚本,不需要同源策略,也就不存在跨越问题。

实现思路:通过nginx配置一个代理服务器(域名与domain1相同,端口不同)做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。

nginx具体配置:

#proxy服务器server {    listen       81;    server_name  www.domain1.com;    location / {        proxy_pass   /www.domain2.com:8080;  #反向代理        proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名        index  index.html index.htm;        # å½“用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用        add_header Access-Control-Allow-Origin /www.domain1.com;  #当前端只跨域不带cookie时,可为*        add_header Access-Control-Allow-Credentials true;
    }
}

1.) 前端代码示例:

var xhr = new XMLHttpRequest();/ å‰ç«¯å¼€å…³ï¼šæµè§ˆå™¨æ˜¯å¦è¯»å†™cookie
xhr.withCredentials = true;/ è®¿é—®nginx中的代理服务器
xhr.open('get', '/www.domain1.com:81/?user=admin', true);
xhr.send();

2.) Nodejs后台示例:

var http = require('http');var server = http.createServer();var qs = require('querystring');

server.on('request', function(req, res) {    var params = qs.parse(req.url.substring(2));    / å‘前台写cookie
    res.writeHead(200, {        'Set-Cookie': 'l=a123456;Path=/;Domain=www.domain2.com;HttpOnly'   / HttpOnly:脚本无法读取
    });

    res.write(JSON.stringify(params));
    res.end();
});

server.listen('8080');console.log('Server is running at port 8080...');

八、 Nodejs中间件代理跨域

node中间件实现跨域代理,原理大致与nginx相同,都是通过启一个代理服务器,实现数据的转发。

1、 非vue框架的跨域(2次跨域)

利用node + express + http-proxy-middleware搭建一个proxy服务器。

1.)前端代码示例:

var xhr = new XMLHttpRequest();/ å‰ç«¯å¼€å…³ï¼šæµè§ˆå™¨æ˜¯å¦è¯»å†™cookie
xhr.withCredentials = true;/ è®¿é—®http-proxy-middleware代理服务器
xhr.open('get', '/www.domain1.com:3000/login?user=admin', true);
xhr.send();

2.)中间件服务器:

var express = require('express');var proxy = require('http-proxy-middleware');var app = express();

app.use('/', proxy({    / ä»£ç†è·¨åŸŸç›®æ ‡æŽ¥å£
    target: '/www.domain2.com:8080',    changeOrigin: true,    / ä¿®æ”¹å“åº”头信息,实现跨域并允许带cookie
    onProxyRes: function(proxyRes, req, res) {
        res.header('Access-Control-Allow-Origin', '/www.domain1.com');
        res.header('Access-Control-Allow-Credentials', 'true');
    },    / ä¿®æ”¹å“åº”信息中的cookie域名
    cookieDomainRewrite: 'www.domain1.com'  / å¯ä»¥ä¸ºfalse,表示不修改
}));

app.listen(3000);console.log('Proxy server is listen at port 3000...');

3.)Nodejs后台同(六:nginx)

2、 vue框架的跨域(1次跨域)

利用node + webpack + webpack-dev-server代理接口跨域。在开发环境下,由于vue渲染服务和接口代理服务都是webpack-dev-server同一个,所以页面与代理接口之间不再跨域,无须设置headers跨域信息了。

webpack.config.js部分配置:

module.exports = {    entry: {},    module: {},
    ...
    devServer: {        historyApiFallback: true,        proxy: [{            context: '/login',            target: '/www.domain2.com:8080',  / ä»£ç†è·¨åŸŸç›®æ ‡æŽ¥å£
            changeOrigin: true,            cookieDomainRewrite: 'www.domain1.com'  / å¯ä»¥ä¸ºfalse,表示不修改
        }],        noInfo: true
    }
}

九、 WebSocket协议跨域

WebSocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯,是server push技术的一种很好的实现。原生WebSocket API使用起来不太方便,我们使用Socket.io,它很好地封装了webSocket接口,提供了更简单、灵活的接口,也对不支持webSocket的浏览器提供了向下兼容。

1.)前端代码:

<div>user input:<input type="text"></div><script src="./socket.io.js"></script><script>var socket = io('/www.domain2.com:8080');/ è¿žæŽ¥æˆåŠŸå¤„理socket.on('connect', function() {    / ç›‘听服务端消息
    socket.on('message', function(msg) {        console.log('data from server: ---> ' + msg); 
    });    / ç›‘听服务端关闭
    socket.on('disconnect', function() { 
        console.log('Server socket has closed.'); 
    });
});document.getElementsByTagName('input')[0].onblur = function() {
    socket.send(this.value);
};</script>

2.)Nodejs socket后台:

var http = require('http');var socket = require('socket.io');/ å¯http服务var server = http.createServer(function(req, res) {
    res.writeHead(200, {        'Content-type': 'text/html'
    });
    res.end();
});

server.listen('8080');console.log('Server is running at port 8080...');/ ç›‘听socket连接
socket.listen(server).on('connection', function(client) {    / æŽ¥æ”¶ä¿¡æ¯
    client.on('message', function(msg) {
        client.send('hello:' + msg);        console.log('data from client: ---> ' + msg);
    });    / æ–­å¼€å¤„理
    client.on('disconnect', function() {        console.log('Client socket has closed.'); 
    });
});


阅读全文

转自:/www.cnblogs.com/sunyuweb/p/9092367.html



Base64编码表:

码值

字符

码值

字符

码值

字符

码值

字符

0

A

16

Q

32

g

48

w

1

B

17

R

33

h

49

x

2

C

18

S

34

i

50

y

3

D

19

T

35

j

51

z

4

E

20

U

36

k

52

0

5

F

21

V

37

l

53

1

6

G

22

W

38

m

54

2

7

H

23

X

39

n

55

3

8

I

24

Y

40

o

56

4

9

J

25

Z

41

p

57

5

10

K

26

a

42

q

58

6

11

L

27

b

43

r

59

7

12

M

28

c

44

s

60

8

13

N

29

d

45

t

61

9

14

O

30

e

46

u

62

+

15

P

31

f

47

v

63

/

 

举个栗子说明原理和过程:

  转码过程例子:3 * 8 = 4 * 6   å†…å­˜1个字节占8位

          转前: s     1    3

先转成ascii对应:115   49   51

 ç¿»è¯‘为2进制8*3:01110011  00110001  00110011

    重新分组6*4:011100   110011   000100   110011

然后计算机是8位的存数,6位不够,高位自动补0 

 ç§‘学计算器输入:00011100  00110011  00000100  00110011

   å¯¹åº”十进制为:28        51       ã€€ã€€4           51

     ç…§è¡¨è¯‘码为:c         z          E       ã€€ã€€  z

 

Base64的JavaScript实现方式:

复制代码

  1 / Create Base64 Objectvar  2 Base64 = {  3   _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",  4   encode: function (e) {  5     var t = "";  6     var n, r, i, s, o, u, a;  7     var f = 0;  8     e = Base64._utf8_encode(e);  9     while (f < e.length) { 10       n = e.charCodeAt(f++); 11       r = e.charCodeAt(f++); 12       i = e.charCodeAt(f++); 13       s = n >> 2; 14       o = (n & 3) << 4 | r >> 4; 15       u = (r & 15) << 2 | i >> 6; 16       a = i & 63; 17       if (isNaN(r)) { 18         u = a = 64 19       } else if (isNaN(i)) { 20         a = 64 21       } 22       t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a) 23     } 24     return t 25   }, 26   decode: function (e) { 27     var t = ""; 28     var n, r, i; 29     var s, o, u, a; 30     var f = 0; 31     e = e.replace(/[^A-Za-z0-9+/=]/g, ""); 32     while (f < e.length) { 33       s = this._keyStr.indexOf(e.charAt(f++)); 34       o = this._keyStr.indexOf(e.charAt(f++)); 35       u = this._keyStr.indexOf(e.charAt(f++)); 36       a = this._keyStr.indexOf(e.charAt(f++)); 37       n = s << 2 | o >> 4; 38       r = (o & 15) << 4 | u >> 2; 39       i = (u & 3) << 6 | a; 40       t = t + String.fromCharCode(n); 41       if (u != 64) { 42         t = t + String.fromCharCode(r) 43       } 44       if (a != 64) { 45         t = t + String.fromCharCode(i) 46       } 47     } 48     t = Base64._utf8_decode(t); 49     return t 50   }, _utf8_encode: function (e) { 51     e = e.replace(/rn/g, "n"); 52     var t = ""; 53     for (var n = 0; n < e.length; n++) { 54       var r = e.charCodeAt(n); 55       if (r < 128) { 56         t += String.fromCharCode(r) 57       } else if (r > 127 && r < 2048) { 58         t += String.fromCharCode(r >> 6 | 192); 59         t += String.fromCharCode(r & 63 | 128) 60       } else { 61         t += String.fromCharCode(r >> 12 | 224); 62         t += String.fromCharCode(r >> 6 & 63 | 128); 63         t += String.fromCharCode(r & 63 | 128) 64       } 65     } 66     return t 67   }, _utf8_decode: function (e) { 68     var t = ""; 69     var n = 0; 70     var r = c1 = c2 = 0; 71     while (n < e.length) { 72       r = e.charCodeAt(n); 73       if (r < 128) { 74         t += String.fromCharCode(r); 75         n++ 76       } else if (r > 191 && r < 224) { 77         c2 = e.charCodeAt(n + 1); 78         t += String.fromCharCode((r & 31) << 6 | c2 & 63); 79         n += 2 80       } else { 81         c2 = e.charCodeAt(n + 1); 82         c3 = e.charCodeAt(n + 2); 83         t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63); 84         n += 3 85       } 86     } 87     return t 88   } 89 } 90 / Define the string 91 var string = 'Hello World!'; 92 / Encode the String 93 var encodedString = Base64.encode(string); 94 console.log(encodedString); / Outputs: "SGVsbG8gV29ybGQh" 95 / Decode the String 96 var decodedString = Base64.decode(encodedString); 97 console.log(decodedString); / Outputs: "Hello World!" 98  99 /这个自定义的Base64对象可以转码的字符也不仅限于Latin1字符;100 var string = "Hello, ä¸­å›½ï¼";101 var encodedString = Base64.encode(string);/"SGVsbG8sIOS4reWbve+8gQ=="102 console.log(encodedString);103 var decodedString = Base64.decode(encodedString);104 console.log(decodedString); /"Hello, ä¸­å›½ï¼"

复制代码

 

javascript的api支持Base64,因此我们可以很方便的来进行编译码。

var encodeData = window.btoa("name=xiaoming&age=10")  /编码  bmFtZT14aWFvbWluZyZhZ2U9MTA=

var decodeData = window.atob(encodeData)   /解码  name=xiaoming&age=10

 

btoa和atob是window对象的两个函数,其中btoa是binary to ascii,用于将binary的数据用ascii码表示,即Base64的编码过程,而atob则是ascii to binary,用于将ascii码解析成binary数据,看一个例子:

复制代码

1 / Define the stringvar
2 string = 'Hello World!';
3 
4 / Encode the Stringvar
5 encodedString = btoa(string);  console.log(encodedString); / Outputs: "SGVsbG8gV29ybGQh"
6 
7 / Decode the Stringvar
8 decodedString = atob(encodedString);  console.log(decodedString); / Outputs: "Hello World!"

复制代码

 

但是window.btoa这中编码方式不能直接作用于Unicode字符串,只能将ascci字符串或二进制数据转换成Base64编码过的字符串。

 

如果要对Unicode字符进行编码可以将做如下转换:

var encodeData = window.btoa(window.encodeURIComponent("name=小明&age=10"))  /编码  bmFtZSUzRCVFNSVCMCU4RiVFNiU5OCU4RSUyNmFnZSUzRDEw

var decodeData = window.decodeURIComponent(window.atob(encodeData))  /解码  name=小明&age=10


阅读全文
2018-06-27

(301) 460-3871

var str = 'javascript';

window.btoa(str)/转码结果 "amF2YXNjcmlwdA=="window.atob("amF2YXNjcmlwdA==")/解码结果 "javascript"

复制代码

二.对于转码来说,Base64转码的对象只能是字符串,因此来说,对于其他数据还有这一定的局限性,在此特别需要注意的是对Unicode转码。

var str = "China,中国"window.btoa(str)

Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.

很明显,这种方式是不行的,那么如何让他支持汉字呢,这就要使用window.encodeURIComponent和window.decodeURIComponent

复制代码

var str = "China,中国";

window.btoa(window.encodeURIComponent(str))/"Q2hpbmElRUYlQkMlOEMlRTQlQjglQUQlRTUlOUIlQkQ="window.decodeURIComponent(window.atob('Q2hpbmElRUYlQkMlOEMlRTQlQjglQUQlRTUlOUIlQkQ='))/"China,中国"

复制代码

 

转自: /www.codeweblog.com/javascript-使用btoa和atob来进行base64转码和解码/

回首过去,回望你自己,你有多少事是得过且过的完成,又有多少事是用心去做并努力达到完美?


阅读全文
2018-06-27

4109353622