Java反射代码片断:你这个“类型”是哪种类型?

Class是哪种Class ? clazz.isPrimitive(); //是否primitive type //是否为primitive type的封装类?看看它在不在下面的map里(这个map节选自spring的ClassUtils.java) primitiveWrapperTypeMap.put(Boolean.class, boolean.class); primitiveWrapperTypeMap.put(Byte.class, byte.class); primitiveWrapperTypeMap.put(Character.class, char.class); primitiveWrapperTypeMap.put(Double.class, double.class); primitiveWrapperTypeMap.put(Float.class, float.class); primitiveWrapperTypeMap.put(Integer.class, int.class); primitiveWrapperTypeMap.put(Long.class, long.class); primitiveWrapperTypeMap.put(Short.class, short.class); clazz.isArray(); //是否为数组类型 拿到的是java.lang.reflect.Type类型,它是哪种Type ? if (javaReflectType instanceof ParameterizedType); //是否为泛型 if (javaReflectType instanceof Class) //是否为类 是哪种泛型 ParameterizedType pt = (ParameterizedType) javaReflectType; Type rawType = pt.getRawType(); //尖括号前面的类型,如List<String>中的List //Collection<SomeClass> if (Collection.class.isAssignableFrom(rawClass)) { Type type = …

Java反射代码片断:你这个“类型”是哪种类型? Read More »

Complete CORS setup on server side

headers.add(“Access-Control-Allow-Origin”, “*”); headers.add(“Access-Control-Allow-Methods”, “GET, POST, PUT, DELETE, OPTIONS, HEAD”); headers.add( “Access-Control-Allow-Headers”, “Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization”); headers.add(“Access-Control-Expose-Headers”, “WWW-Authenticate”);

关于浏览器同源策略的几点说明

没有同源策略倒底会怎么样?真的会有问题? 如果用户登录网银,再在同一个浏览器的一个tab里打开一个恶意站点;这个恶意站点页面里包含一段js代码: var balanceHtml = ajax.get(“http://mybank/我的余额.jsp”); ajax.post(“http://恶意站点/保存信息.jsp”, balanceHtml); 那么用户的银行余额会轻松地被恶意站点窃取。 有了同源策略, 上面的第一行代码会被浏览器拒绝执行 (严格地说,是会执行,但不会有返回值;所以“/转账给我.jsp”这类操作应该通过csrf token保护起来) 那么通过jsonp跨域,然后再窃取网银余额呢? 恶意站点的<script src="http://mybank/我的余额.jsp">不会执行成功,因为拿到的结果不是合法的JS语句,无法继续执行。 但如果网银服务端以正规jsonp格式暴露了余额数据,那么恶意站点的<script src="http://mybank/我的余额.jsonp"/>最终会变成 callback({"balance":"1000块"})来执行,数据一下子就偷到了。 所以,机密数据不能通过jsonp来暴露。 设置document.domain可以跨子域 1. 要注意的是,设置document.domain时要求两个页面都设置成一模一样的domain. 一个domain.com, 另一个a.domain.com是不行的。 2. 如果a.domain.com的页面想访问b.domain.com的ajax服务,通过设置document.domain这种方式是无效的。因为ajax返回的只是一串json,没地方设置domain. 设置document.domain这种作法更适合于iframe包含的情境。 待续。。。

jsonp原理

远程jsonp服务提供的东西和普通的ajax+json一样,也是一串json. 普通ajax调用受限于浏览器的同域限制,只适用于客户端和服务端属于同一个域名的情况。 jsonp就是用来突破这个限制的。它本质并不是ajax调用,而是一个“远程script源码的引用” <script src="http://remote-site/hello.jsonp"> <!–这种引用不受同源策略限制–> </script> http://remote-site/hello.jsonp返回的格式类似于: 引用    onJsonpLoad("{resut:success,value:123}"); 也就是说,返回的是一条符合JS语法的javascript语句   1. 所以,<script src="xxx"/>这种方式才能成功运行。   2. 远程返回语句后,客户端还会立即执行这条语句;这就意味着onJsonpLoad()方法是客户端中的一个回调方法。为了给予客户端足够的灵活性,服务端一般不会将回调方法名写死,而是让客户端在URL里指定,再原样返回。

考虑到编码问题,最好不要在远程登录工具里向数据库写入非西欧字符

用远程登录工具(如putty)登录远程主机后,再在工具的窗口里登录数据库,然后写入非西欧字符,很容易导致乱码。 今天我就是这样遇到乱码的:   1. 在xshell窗口里登录localhost数据库,用insert语句插入汉字,页面显示乱码,虽然主机、数据库、php的字符集方式都是乱码。   2. 改用 mysql> source sql文件,仍然乱码。 远程登录工具在编码问题上一直都牵扯不清。为了避免乱码,最好使用下列方式之一:   1. 在ubuntu原生shell里直接登录远程数据库   2. 在ubuntu原生sheel里ssh登录远程主机,再在这个窗口里登录主机上的数据库

mysql数据备份的策略和工具

一般要同时考虑全量备份和增量备份,比如一周一个全量,一天一个增量。 全量备份用mysqldump,一般用它生成一堆sql 增量备份要依赖binlog相关的东西 全量备份和恢复的脚本 备份脚本 引用 #!/bin/sh now_day=`/bin/date +%Y%m%d` now_time=`date +%Y%m%d%H%M%S` data_root=’/somepath/backup’ this_data_dir=$data_root/$now_day this_data_file=$now_time.sql mkdir -p $this_data_dir mysqldump -h host -uuser -ppassword database > $this_data_dir/$this_data_file 将以上脚本加入cron 引用 crontab -e 00 22 * * * /somepath/backup.sh  ##一天一次,每天10点 数据恢复其实就是执行备份出的sql 引用 mysql -h host -uuser -ppassword database < /somepath/some-backup-file.sql 待续

codeIgniter默认情况下关闭浏览器不会使session过期

codeIgniter默认情况下关闭浏览器不会使session过期。也就是说,如果你没有显式登出而只是关闭浏览器,在一定时间内(codeIgniter默认是2小时)打开浏览器重新访问这个网站,会发现你仍处于登录状态。 为了规避这个风险,应该 //config.php $config[‘sess_expire_on_close’] = TRUE;