bingo 发布的文章

JavaScript 基础

JavaScript是一种基于对象(object)和时间驱动(Event Driven)并且具有安全性能的脚本语言
JavaScript是一种脚本编程语言,也是一种解释性语言
JavaScript的程序是通过客户端浏览器来解析的,与web服务器无关

JavaScript的基本语法:

    1、区分大小写:变量、函数名和操作符都区分大小写
    2、标识符:第一个字符必须是字母、下划线或是一个美元符号$,其他字符可以是字母、下划线、美元符或数字
    3、不能把关键字、保留字,如:true、false、null用作标识符
    4、定义变量时要使用var操作符,后跟变量名称
    

JavaScript的数据类型:

    基本数据类型:字符串、数值型、布尔型
    复合数据类型:对象、数组
    其他数据类型:函数、null、undefined
  
    数据类型的转换:隐式类型转换、显式类型转换
                        隐式类型转换的情况:
                                        数字类型:在字符串环境下转换为'数字',在布尔环境下非零数字转换为true
                                        非空字符串:数字环境下转换为字符串中的数字或NaN,布尔环境下转换为true
                                        空字符串:数字环境下转换为0,布尔环境转换为false
                                        null:字符串环境下转换为null,数字环境下转换为0,布尔环境下转换为false
                                        NaN:字符串环境下转换为NaN,布尔环境下转换为false
                                        undefined:字符串环境下转换为'undefined',数字环境下转换为NaN,布尔环境下转换为false
                        显示类型转换的情况:
                                        可以使用Number()、Boolean()、String()函数来将数据类型转换成数字型、布尔型、字符串型
                                        数字类型转换字符串,可以将其与一个空字符串相连
                                        字符串型转换数字型,可以将其减0
                                        字符串或数字型转换成布尔型,可以使用两次!(感叹号)
    
    字符串型是JavaScript中用来表示文本的数据类型
                        字符串对象的声明方法:
                                        1、var str = new string('asdaf')
                                        2、var str = 'sdfghjk'
                        字符串对象的方法:
                                       index0f():返回子字符串在字符串中第一次出现的位置
                                       lastIndex0f():返回子字符串在字符串中最后一次出现的位置
                                       match():找到一个或多个正则表达式匹配
                                       replace(表达式,替换的字符串):替换一个与正则表达式相匹配的子串
                                       split(正则表达式,数组最大长度):用于把一个字符串分割成字符串的数组
                                       toLowerCase():将字符串转换为小写
                                       toUpperCase():将字符串转换为大写
                                       slice(开始下标,结束下标):得到一个从开始下标到结束下标的子字符串
                                       substr(开始下标,截取长度):得到一个从开始下标到指定长度的子字符串
                                       search(正则):查找与正则表达式相匹配的子字符串
    
    NaN即非数值,是一个特殊的数值,这个数值用于表示这个本来要返回数值的操作数未返回数值的情况
    NaN的特点:任何涉及NaN的操作,结果都是NaN
                          NaN与任何值都不相等,包括NaN本身
    对象和数组一样,都是一些数据的集合,这些数据可以是字符串、数字型、布尔型,也可以是复合型
    null是一个特例的数据类型,代表的意思是空,但这个空不代表是0或空字符串,null是没有值,不是一个有效的数字、字符串,也不是数组、对象和函数,什么数据类型都不是
    undefined是一个特例的数据类型,只能定义了一个变量但没有为该变量赋值,使用一个并未定义的变量或者是使用了一个不存在的对象的属性时,JavaScript就会返回undefined
    
    数组:在JavaScript中并不支持多维数组,但是JavaScript中数组元素可以是任何类型的数据,包括数组,
               在JavaScript中数组也是一种对象,这种对象称为数组对象
               数组元素是不能被删除的,只能删除数组元素的值,恢复到未赋值的状态,即undefined,却不能让数组中的元素减少一个
               数组元素的个数:array.length
               数组定义的方法:
                            1、var arr = new Array();            定义一个空数组
                            2、var arr = new Array(2);          定义一个最小长度为2的数组
                            3、var arr = new Array('a','b',......);        定义一个有初始值的数组
                            4、var arr = [1,2,4,.....];            直接定义数组
               数组的方法:
                            tostring():将数组转换为字符串,有逗号连接
                            join():将数组元素连接成字符串(可以自定义连接符)
                            push():在数组尾部添加元素,原数组会改变
                            concat():添加元素并生产新数组
                            unshift():在数组头部添加元素
                            pop():删除并返回数组的最后一个元素
                            shift():删除并返回数组的第一个元素
                            splice(下标,下标,替换的字符):如果只有一个参数就是删除、如果有两个参数就是查找,如果有三个参数就是查找出来匹配的值,并把原数组替换
                            slice(开始下标,结束下标):返回数组中的一部分
                            reverse():颠倒数组中的元素
    数值转换:
                Number():null返回0,undefined返回NaN,
                                    如果是字符串:'011'变成11,如果是空字符串转换为0
                                                             'oxf'会变成相同大写的十进制整数                    
                                                             如果字符串包含上述以外的字符,将其转换为NaN
                Parselnt():忽略字符前面的空格,直到找到第一个非空格字符
                                    如果第一个字符不是数字或者是负号,返回NaN
                                    空字符串,返回NaN
                                    如果第一个是数字,会继续解析,直到遇到一个非数字
                                    如果字符串以0x开头且后面跟数字字符,就会转成16进制,八进制也一样
                ParseFloat():第一个小数点是有效的,第二个小数点无效
                                       始终忽略前面的0,不分进制
                                       十六进制会被转换成0
                                       空字符串转换为NaN
                                    

JavaScript的函数:

    JavaScript中,使用function语句定义函数,也可以使用Function构造函数来定义函数
    JavaScript中的函数不允许给参数赋初始值
    函数的声明方法:
                1、function  函数名(参数1.。。。){语句块;return 返回值}
                2、var  函数名 = new Function(参数1,参数2,。。。,函数体)
                3、var  函数名 = function (参数1,参数2,。。。){函数体}
   

JavaScript对象的声明:

    对象的声明方法:
                1、var 对象名 = {属性名1:属性值,属性名2:属性值2........}
                2、var  myobject = new Object();
                        myobject.name ='lili';
                        myobject.age = 20;
    eval():将字符串指定为对象

JavaScript中的内置对象:

    日期对象:
            getFullYear():返回4位数年份
            getMonth():返回月份0-11
            getDate():返回日期对象中的一个月中的第几天
            getHours():返回日期中的小时部分
            getTime():返回日期对象中的时间戳的毫秒部分
            getMilliseconds():返回日期对象中的毫秒部分
            getTimezoneOffset():返回日期对象中的时区的时间差,单位秒
    数学对象:
            Math.E:自然对数的底数(e)
            Math.abs():绝对值
            Math.ceil():进一取整
            Math.floor():退一取整
            Math.pow():求几次幂
            Math.round():四舍五入
            Math.sqrt():平方根
            Math.random():0.0~1.0之间的随机数

JavaScript中+(加号)表示连接字符,.(点)来调用和设置对象的属性或者方法(如:d.name)this代表的是当前对象
for..in可以遍历数组,也可以遍历对象

            例:for(var i in arr){alert(arr[i])}

Java保留字

保留字不能用于常量、变量、和任何标识符的名称。

关键字 描述
abstract 抽象方法,抽象类的修饰符
assert 断言条件是否满足
boolean 布尔数据类型
break 跳出循环或者label代码段
byte 8-bit 有符号数据类型
case switch语句的一个条件
catch 和try搭配扑捉异常信息
char 16-bit Unicode字符数据类型
class 定义类
const 未使用
continue 不执行循环体剩余部分
default switch语句中的默认分支
do 循环语句,循环体至少会执行一次
double 64-bit双精度浮点数
else if条件不成立时执行的分支
enum 枚举类型
extends 表示一个类是另一个类的子类
final 表示一个值在初始化之后就不能再改变了
表示方法不能被重写,或者一个类不能有子类
finally 为了完成执行的代码而设计的,主要是为了程序的健壮性和完整性,无论有没有异常发生都执行代码。
float 32-bit单精度浮点数
for for循环语句
goto 未使用
if 条件语句
implements 表示一个类实现了接口
import 导入类
instanceof 测试一个对象是否是某个类的实例
int 32位整型数
interface 接口,一种抽象的类型,仅有方法和常量的定义
long 64位整型数
native 表示方法用非java代码实现
new 分配新的类实例
package 一系列相关类组成一个包
private 表示私有字段,或者方法等,只能从类内部访问
protected 表示字段只能通过类或者其子类访问
子类或者在同一个包内的其他类
public 表示共有属性或者方法
return 方法返回值
short 16位数字
static 表示在类级别定义,所有实例共享的
strictfp 浮点数比较使用严格的规则
super 表示基类
switch 选择语句
synchronized 表示同一时间只能由一个线程访问的代码块
this 表示调用当前实例
或者调用另一个构造函数
throw 抛出异常
throws 定义方法可能抛出的异常
transient 修饰不要序列化的字段
try 表示代码块要做异常处理或者和finally配合表示是否抛出异常都执行finally中的代码
void 标记方法不返回任何值
volatile 标记字段可能会被多个线程同时访问,而不做同步
while while循环

加密种类

加解密相关知识

对称加密

对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。

常见的对称加密有:DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、RC4、IDEA

非对称加密

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey);并且加密密钥和解密密钥是成对出现的。非对称加密算法在加密和解密过程使用了不同的密钥,非对称加密也称为公钥加密,在密钥对中,其中一个密钥是对外公开的,所有人都可以获取到,称为公钥,其中一个密钥是不公开的称为私钥。

非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是 2048 位,意味着待加密内容不能超过 256 个字节。

摘要算法

数字摘要是采用单项Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文,这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。“数字摘要“是https能确保数据完整性和防篡改的根本原因。

数字签名

数字签名技术就是对“非对称密钥加解密”和“数字摘要“两项技术的应用,它将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

数字签名的过程如下:

明文 --> hash运算 --> 摘要 --> 私钥加密 --> 数字签名

数字签名有两种功效:

一、能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。

二、数字签名能确定消息的完整性。

注意:
数字签名只能验证数据的完整性,数据本身是否加密不属于数字签名的控制范围

数字证书

为什么要有数字证书?

对于请求方来说,它怎么能确定它所得到的公钥一定是从目标主机那里发布的,而且没有被篡改过呢?亦或者请求的目标主机本本身就从事窃取用户信息的不正当行为呢?这时候,我们需要有一个权威的值得信赖的第三方机构(一般是由政府审核并授权的机构)来统一对外发放主机机构的公钥,只要请求方这种机构获取公钥,就避免了上述问题的发生。

数字证书的颁发过程

用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息(根证书私钥签名)。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布,数字证书各不相同,每种证书可提供不同级别的可信度。
证书包含哪些内容

证书颁发机构的名称
证书本身的数字签名
证书持有者公钥
证书签名用到的Hash算法

验证证书的有效性

1、浏览器默认都会内置CA根证书,其中根证书包含了CA的公钥
2、证书颁发的机构是伪造的:浏览器不认识,直接认为是危险证书
证书颁发的机构是确实存在的,于是根据CA名,找到对应内置的CA根证书、CA的公钥。用CA的公钥,对伪造的证书的摘要进行解密,发现解不了,认为是危险证书。
3、对于篡改的证书,使用CA的公钥对数字签名进行解密得到摘要A,然后再根据签名的Hash算法计算出证书的摘要B,对比A与B,若相等则正常,若不相等则是被篡改过的。
4、证书可在其过期前被吊销,通常情况是该证书的私钥已经失密。较新的浏览器如Chrome、Firefox、Opera和Internet Explorer都实现了在线证书状态协议(OCSP)以排除这种情形:浏览器将网站提供的证书的序列号通过OCSP发送给证书颁发机构,后者会告诉浏览器证书是否还是有效的。

1、2点是对伪造证书进行的,3是对于篡改后的证书验证,4是对于过期失效的验证。

PHP 数组相关处理方法

//对多维数组按照某个字段进行排序
public function arr_sort($array,$key,$order="asc"){//asc是升序 desc是降序
$arr_nums=$arr=array();
foreach($array as $k=>$v){
$arr_nums[$k]=$v[$key];
}

if($order=='asc'){
asort($arr_nums);
}else{
arsort($arr_nums);
}

foreach($arr_nums as $k=>$v){
$arr[$k]=$array[$k];
}
return $arr;
}


//array_pad函数,数组数组首尾选择性追加$num = array(1=>10,2=>20,3=>30);

$num = array_pad($num,4,40);
print_r($num);//Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 )$num = array_pad($num,-5,50);//array_pad(array,size,value)
print_r($num);//Array ( [0] => 50 [1] => 10 [2] => 20 [3] => 30 [4] => 40 ) ?>

size:指定的长度。整数则填补到右侧,负数则填补到左侧。


array_splice()删除数组成员 :
$color = array("red", "green", "blue", "yellow");

count ($color); //得到4
array_splice($color,1,1); //删除第二个元素
print_r(count ($color)); //3echo$color[2]; //yellowecho$color[1]; //blue?>

php 判断文件或目录是否存在有自带的函数,file_exists文件是否存在,判断目录是否存在我们用is_dir就ok了。


//sizeof的使用echo sizeof($array);//7;统计数组元素的个数//array_count_values$num = array(10,20,30,10,20,1,0,10);//统计数组元素出现的次数

print_r(array_count_values($num));//Array ( [10] => 3 [20] => 2 [30] => 1 [1] => 1 [0] => 1 ) ?>

current():每个数组都有一个内部指针指向他的当前单元,初始指向插入到数组中的第一个元素


    /**
     * 把对象转换成数组
     * @param   object  $object 要转换的对象
     * @return  array
     */
    public function objectArray($object) {
        if( count($object)==0 )  return trim((string)$object);
        $result = array();
        $object = is_object($object) ? get_object_vars($object) : $object;
        foreach ($object as $key => $val) {
            $val = (is_object($val) || is_array($val)) ? $this -> objectArray($val) : $val;
            $result[$key] = $val;
        }
        return $result;
    }

//数组处理 ,把二位数组处理成为一维数组
public function array_multi2single($array){
    static $result_array=array();
    foreach($array as $k => $value){
        if(is_array($value)){

            $this -> array_multi2single($value);

        }else{
            $result_array[$k]=$value;
        }
    }
    return $result_array;
}

/**
 * 从数组中删除空白的元素
 * @param  $arr 
 * @param  boolean $trim
 * 
 */
function array_remove_empty(&$arr, $trim = true)     
{     
    foreach ($arr as $key => $value) {     
        if (is_array($value)) {     
            array_remove_empty($arr[$key]);     
        } else {     
            $value = trim($value);     
            if ($value == '') {     
                unset($arr[$key]);     
            } elseif ($trim) {     
                $arr[$key] = $value;     
            }    
        }     
    }     
}