网站首页php

Js与PHP数据交互

发布时间:2015-11-02 09:30:02编辑:阅读(1513)

    因为安全问题, 已将所有前端提交数据进行过滤,而此时后台有时会需要更新一些页面跟踪代码js之类的。这时提交的js代码是无法交给后台的, 所以需要将提交的代码进行处理。

    这里一般有两种方法:


    一、前端用JS的escape函数, 将所有的ASCII 字母和数字这外的字符进行编码,使用ajax提交,

    <script>
    var content=escape($("#content").val());
    $.post("process_url", {content:content}, function(data){
    //process
    });
    </script>


    然后在后端使用PHP编写的unescape函数进行解码,

    <?php
    $content=unescape($_POST['content']);
    ?>


    PHP的unescape函数如下所示:

    <?php
    /** php函数,用于解码在前端用js编码过的数据
     * 输入参数 $str 字符串
     * 返回解码后的字符串
     */
    function unescape($str){
    $ret = ''; 
    $len = strlen($str); 
    for ($i = 0; $i < $len; $i++){ 
    if ($str[$i] == '%' && $str[$i+1] == 'u'){ 
    $val = hexdec(substr($str, $i+2, 4)); 
    if ($val < 0x7f) $ret .= chr($val); 
    else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f)); 
    else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f)); 
    $i += 5; 
    } 
    else if ($str[$i] == '%'){ 
    $ret .= urldecode(substr($str, $i, 3)); 
    $i += 2; 
    } 
    else $ret .= $str[$i]; 
    } 
    return $ret; 
    }
    ?>



    二、前端用Jquery库jquery.base64.js的base64相关函数,将提交的数据编码后,使用ajax提交,

    <script language="javascript" src="jquery-1.11.3.js"></script>
    <script language="javascript" src="jquery.base64.js"></script>
    <script>
    $.base64.utf8encode = true;
    var content= $.base64.btoa($("#content").val());
    $.post("process_url", {content:content}, function(data){
    //process
    });
    </script>


    然后在后端使用PHP的base64_decode函数进行解码。

    <?php
    $content=base64_decode($_POST['content']);
    ?>


    ---------------------------------我是分割线--------------------------------------


    上面第二种方式已过期, 现在使用以下方法来实现base64编码:

    base64编码:

    function b64EncodeUnicode(str) {
        return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
            return String.fromCharCode('0x' + p1);
        }));
    }
    
    b64EncodeUnicode('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="

    base64解码:

    function b64DecodeUnicode(str) {
        return decodeURIComponent(atob(str).split('').map(function(c) {
            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
        }).join(''));
    }
    
    b64DecodeUnicode('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"
    b64DecodeUnicode('Cg=='); // "\n"

    无需引入任何文件,直接使用:)


评论