1.cookie跨域共享
转载自:http://blog.csdn.net/ahhsxy/article/details/7356128
这里所说的跨域,是指跨二级域名,而且这些域名对应的应用都在同一个app上, 比如我有以下3个域名:
www.vinceruan.info
blog.vinceruan.info
bbs.vinceruan.info
我要在这三个域名直接共享cookie或者共享session,如何实现呢?在tomcat下又如何实现呢?
首先我们来了解下cookie,顾名思义,小甜心,少食即可,多吃无益。cookie是通过浏览器保存在客户端的临时数据,一般这些数据对安全的要求不高,虽然可以通过加密存放和SSL方式提交的方式加强cookie的安全,但不代表cookie就是百分之百安全的。再者,写入太多的cookie会造成数据管理的不可控,所以建议尽量少写cookie,像网易、新浪这些大型互联网公司,如果观察一下他们的站点,你会发觉他们会在浏览器写下大量的cookie,不过他们内部一般会有一套严格的cookie写入和清理的管理规定。比如网易邮件事业部就有这些规定。
cookie有两个很重要的属性:domain和path
domain告诉浏览器当前要添加的cookie的域名归属,如果没有明确指明则默认为当前域名,比如通过访问www.vinceruan.info添加的cookie的域名默认就是www.vinceruan.info,通过访问blog.vinceruan.info所生成的cookie的域名就是blog.vinceruan.info.
path告诉浏览器当前要添加的cookie的路径归属,如果没有明确指明则默认为当前路径,比如通过访问www.vinceruan.info/java/hotspot.html添加的cookie的默认路径就是/java/,通过blog.vinceruan.info/java/hotspot.html生成的cookie的路径也是/java/.
在清楚domain和path的生成规则后,我们需要知道浏览器在什么时候提交什么cookie到服务器,即浏览器是通过怎样的规则筛选cookie并提交到服务器的?
浏览器提交的cookie需要满足以下两点:
1.当前域名或者父域名下的cookie
而且
2.当前路径或父路径下的cookie
要满足以上两个条件的cookie才会被提交.举个例子:有4个cookie:
cookie1:[name=value, domain=.vinceruan.info path=/]
cookie2:[name=value, domain=blog.vinceruan.info path=/java/]
cookie3:[name=value, domain=www.vinceruan.info path=/]
cookie4:[name=value, domain=blog.vinceruan.info path=/]
当我访问blog.vinceruan.info时,
cookie1可以被提交,因为.vinceruan.info是blog.vinceruan.info的父域名. path路径也一致.
cookie2不能被提交,因为虽然domain是保持一致的,但是path不一致,当前访问的是/, 但是cookie2的path是/java/
cookie3不能被提交,因为虽然path是一致的,但是www.vinceruan.info不是blog.vinceruan.info的父域名.
cookie4可以被提交,因为domain和cookie都严格保持一致.
这里需要注意的是, 在浏览器看来.www.vinceruan.info不是blog.vinceruan.info的父域名,而vinceruan.info才是blog.vinceruan.info的父域名,www.vinceruan.info也算是一个二级域名(这点如果你提交过域名到DNS服务器商的应该会知道,一般我们需要显式提交www.vinceruan.info和vinceruan.info, 否则www.vinceruan.info==vinceruan.info是不成立的).
所以如果我们需要在所有二级域名下共享islogin=1的cookie,用java代码如下:
Cookie c = new Cookie("islogin","1");
c.setDomain(".vinceruan.info");//注意是以点号开头的.
c.setPath=("/");
response.addCookie(c);
如果要在所有的二级域名下的/java/路径下共享silogin=1的cookie,用java代码如下:
Cookie c = new Cookie("islogin","1");
c.setDomain(".vinceruan.info");//注意是以点号开头的.
c.setPath=("/java/");
response.addCookie(c);
2.URLEncoder.encode方法
转载自https://blog.csdn.net/qq_40741855/article/details/88876271
一:我们先看2个编码的情况
String name=java.net.URLEncoder.encode("测试", "UTF-8");
System.out.println(name);
name=java.net.URLEncoder.encode(name,"UTF-8");
System.out.println(name);
name=java.net.URLDecoder.decode(name, "UTF-8")
System.out.println(name);
System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));
输出结果是
%E6%B5%8B%E8%AF%95
%25E6%25B5%258B%25E8%25AF%2595
%E6%B5%8B%E8%AF%95;//这里用ISO-8859-1解码也是%E6%B5%8B%E8%AF%95
测试
二:我们来看编码一次,提交给服务器的结果
我们吧“测试”编码一次的字符串%E6%B5%8B%E8%AF%95 ,提交,服务器端用request.getParameter("name")的到参数,然后我们解码
System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));
我们发现得到的结果 ???è? 显示乱码。
因为在request.getParameter("name")之前会自动做一次解码的工作,而且是默认的ISO-8859-1,相当于调用了一次java.net.URLDecoder.decode(name, "ISO-8859-1")
所以我们再用URLDecoder.decode(name, "UTF-8")就是乱码了。
三: 我们在看编码2次,提交给服务器的结果
编码2次的字符串是%25E6%25B5%258B%25E8%25AF%2595 ,服务器端用request.getParameter("name")的到参数,自动按ISO-8859-1解码得到的串是%E6%B5%8B%E8%AF%95 ,也就是编码一次得到的字符串。
然后,我们在System.out.println(java.net.URLDecoder.decode(name, "UTF-8"));解码输出,得到的结果就是 “测试” 2个汉字。
3 转译
\\会转义成反反斜杠,反斜杠本身就是转义符,所以就成了“\.”,在进行转义就是.,所以\\.实际上dao是“.”
/**
* 得到cookie的域名
*/
private static final String getDomainName(HttpServletRequest request) {
String domainName = null;
String serverName = request.getRequestURL().toString();
if (serverName == null || serverName.equals("")) {
domainName = "";
} else {
serverName = serverName.toLowerCase();
serverName = serverName.substring(7);
final int end = serverName.indexOf("/");
serverName = serverName.substring(0, end);
final String[] domains = serverName.split("\\.");
serverName.split(".");
int len = domains.length;
if (len > 3) {
// www.xxx.com.cn
domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
} else if (len <= 3 && len > 1) {
// xxx.com or xxx.cn
domainName = "." + domains[len - 2] + "." + domains[len - 1];
} else {
domainName = serverName;
}
}
if (domainName != null && domainName.indexOf(":") > 0) {
String[] ary = domainName.split("\\:");
domainName = ary[0];
}
return domainName;
}