cookie的基础知识就不介绍了,自己去百度。

一、jsp读写cookie

jsp写cookie的代码如下:

Cookie cookie1 = new Cookie("historyCity", Escape.escape(historyCity));
cookie1.setMaxAge(700*24*60*60);
cookie1.setPath("/");
response.addCookie(cookie1);

jsp读取cookie的代码如下:

String historyCity  ="";
Cookie[] cookies = request.getCookies();// 遍历数组,获得具体的Cookie
if(cookies != null){for(int i=0; i<cookies.length; i++) {Cookie cookie = cookies[i];if("historyCity".equals(cookie.getName())){               historyCity = cookie.getValue();historyCity = Escape.unescape(historyCity);              }}
} 

里面用到了Escape类的escape方法和unescape方法,如果不使用这两个方法的话,jsp从cookie里面读取出来的值时如下格式:

%u9EC4%u4FEE%u7FA4,

jsp使用java.net.URIDecoder.decode()方法,则出现解码错误:

2010-5-19 15:28:03 org.apache.catalina.core.ApplicationDispatcher invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u9"at java.net.URLDecoder.decode(URLDecoder.java:173)

由于取到的参数是  u9EC4%u4FEE%u7FA4格式的,没法用常规的URLDecoder.decode()来进行解码,还好,这世上的牛人够多,在网上直接找到了一个工具类,能实现 Javascript中escape()及unescape()式的编解码,源代码如下:

/*** JavaScript escape/unescape 编码的 Java 实现* author jackyz* keep this copyright info while using this method by free*/
public class Escape {private final static String[] hex = {"00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F","10","11","12","13","14","15","16","17","18","19","1A","1B","1C","1D","1E","1F","20","21","22","23","24","25","26","27","28","29","2A","2B","2C","2D","2E","2F","30","31","32","33","34","35","36","37","38","39","3A","3B","3C","3D","3E","3F","40","41","42","43","44","45","46","47","48","49","4A","4B","4C","4D","4E","4F","50","51","52","53","54","55","56","57","58","59","5A","5B","5C","5D","5E","5F","60","61","62","63","64","65","66","67","68","69","6A","6B","6C","6D","6E","6F","70","71","72","73","74","75","76","77","78","79","7A","7B","7C","7D","7E","7F","80","81","82","83","84","85","86","87","88","89","8A","8B","8C","8D","8E","8F","90","91","92","93","94","95","96","97","98","99","9A","9B","9C","9D","9E","9F","A0","A1","A2","A3","A4","A5","A6","A7","A8","A9","AA","AB","AC","AD","AE","AF","B0","B1","B2","B3","B4","B5","B6","B7","B8","B9","BA","BB","BC","BD","BE","BF","C0","C1","C2","C3","C4","C5","C6","C7","C8","C9","CA","CB","CC","CD","CE","CF","D0","D1","D2","D3","D4","D5","D6","D7","D8","D9","DA","DB","DC","DD","DE","DF","E0","E1","E2","E3","E4","E5","E6","E7","E8","E9","EA","EB","EC","ED","EE","EF","F0","F1","F2","F3","F4","F5","F6","F7","F8","F9","FA","FB","FC","FD","FE","FF"};private final static byte[] val = {0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F};public static String escape(String s) {StringBuffer sbuf = new StringBuffer();int len = s.length();for (int i = 0; i < len; i++) {int ch = s.charAt(i);if (ch == ' ') {                        // space : map to '+' sbuf.append('+');} else if ('A' <= ch && ch <= 'Z') {    // 'A'..'Z' : as it wassbuf.append((char)ch);} else if ('a' <= ch && ch <= 'z') {    // 'a'..'z' : as it wassbuf.append((char)ch);} else if ('0' <= ch && ch <= '9') {    // '0'..'9' : as it wassbuf.append((char)ch);} else if (ch == '-' || ch == '_'       // unreserved : as it was|| ch == '.' || ch == '!'|| ch == '~' || ch == '*'|| ch == '/' || ch == '('|| ch == ')') {sbuf.append((char)ch);} else if (ch <= 0x007F) {              // other ASCII : map to %XXsbuf.append('%');sbuf.append(hex[ch]);} else {                                // unicode : map to %uXXXXsbuf.append('%');sbuf.append('u');sbuf.append(hex[(ch >>> 8)]);sbuf.append(hex[(0x00FF & ch)]);}}return sbuf.toString();}public static String unescape(String s) {StringBuffer sbuf = new StringBuffer();int i = 0;int len = s.length();while (i < len) {int ch = s.charAt(i);if (ch == '+') {                        // + : map to ' ' sbuf.append(' ');} else if ('A' <= ch && ch <= 'Z') {    // 'A'..'Z' : as it wassbuf.append((char)ch);} else if ('a' <= ch && ch <= 'z') {    // 'a'..'z' : as it wassbuf.append((char)ch);} else if ('0' <= ch && ch <= '9') {    // '0'..'9' : as it wassbuf.append((char)ch);} else if (ch == '-' || ch == '_'       // unreserved : as it was|| ch == '.' || ch == '!'|| ch == '~' || ch == '*'|| ch == '/' || ch == '('|| ch == ')') {sbuf.append((char)ch);} else if (ch == '%') {int cint = 0;if ('u' != s.charAt(i+1)) {         // %XX : map to ascii(XX)cint = (cint << 4) | val[s.charAt(i+1)];cint = (cint << 4) | val[s.charAt(i+2)];i+=2;} else {                            // %uXXXX : map to unicode(XXXX)cint = (cint << 4) | val[s.charAt(i+2)];cint = (cint << 4) | val[s.charAt(i+3)];cint = (cint << 4) | val[s.charAt(i+4)];cint = (cint << 4) | val[s.charAt(i+5)];i+=5;}sbuf.append((char)cint);}i++;}return sbuf.toString();}public static void main(String[] args) {String stest = "黄修群1234 abcd[]()<+>,.~//";System.out.println(stest);System.out.println(escape(stest));System.out.println(unescape(escape(stest)));}
}

二、Javascript读写cookie

//添加cookiesetCookie = function(c_name, value, expiredays) {var exdate = new Date()exdate.setDate(exdate.getDate() + expiredays)cookieVal = c_name + "=" + escape(value)+ ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString()+";path=/");//    alert(cookieVal);document.cookie = cookieVal;
}
//获取cookie
function getCookie(c_name) {if (document.cookie.length > 0) {c_start = document.cookie.indexOf(c_name + "=")if (c_start != -1) {c_start = c_start + c_name.length + 1c_end = document.cookie.indexOf(";", c_start)if (c_end == -1)c_end = document.cookie.length//        document.write(document.cookie.substring(c_start,c_end)+"<br>");return unescape(document.cookie.substring(c_start, c_end))}}return ""
}

下面讲讲cookie的跨域操作

正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。 
1.可在同一应用服务器内共享方法:设置cookie.setPath("/"); 
    本机tomcat/webapp下面有两个应用:cas和webapp_b, 
    1)原来在cas下面设置的cookie,在webapp_b下面获取不到,path默认是产生cookie的应用的路径。 
    2)若在cas下面设置cookie的时候,增加一条cookie.setPath("/");或者cookie.setPath("/webapp_b/");就可以在webapp_b下面获取到cas设置的cookie了。 
    3)此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此cookie.setPath("/");之后,可以在webapp文件夹下的所有应用共享cookie,而cookie.setPath("/webapp_b/");是指cas应用设置的cookie只能在webapp_b应用下的获得,即便是产生这个cookie的cas应用也不可以。 
    4)设置cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b/jsp/")的时候,只有在webapp_b/jsp下面可以获得cookie,在webapp_b下面但是在jsp文件夹外的都不能获得cookie。 
    5)设置cookie.setPath("/webapp_b");,是指在webapp_b下面才可以使用cookie,这样就不可以在产生cookie的应用cas下面获取cookie了 
    6)有多条cookie.setPath("XXX");语句的时候,起作用的以最后一条为准。 
    6)设置多个path的方法???

2.跨域共享cookie的方法:设置cookie.setDomain(".jszx.com"); 
    A机所在的域:home.langchao.com,A有应用cas 
    B机所在的域:jszx.com,B有应用webapp_b 
    1)在cas下面设置cookie的时候,增加cookie.setDomain(".jszx.com");,这样在webapp_b下面就可以取到cookie。 
    2)这个参数必须以“.”开始。 
    3)输入url访问webapp_b的时候,必须输入域名才能解析。比如说在A机器输入:http://lc-bsp.jszx.com:8080/webapp_b,可以获取cas在客户端设置的cookie,而B机器访问本机的应用,输入:http://localhost:8080/webapp_b则不可以获得cookie。 
    4)设置了cookie.setDomain(".jszx.com");,还可以在默认的home.langchao.com下面共享。 
    5)设置多个域的方法???

以上内容是我从多个网页转载而来,链接如下:

http://www.cnblogs.com/muzongyan/archive/2010/08/30/1812552.html

http://www.java-zone.org/1052.html

http://xuliangyong.iteye.com/blog/34400

http://blog.csdn.net/hbzyaxiu520/article/details/5607873

Jsp和Javascript读写cookie,cookie的path设置,jsp解码cookie值相关推荐

  1. java删除cookie信息_java如何设置和删除cookie

    /** * 删除cookie */ public static void clearCookie(HttpServletRequest request,HttpServletResponse resp ...

  2. set-cookie 和 cookie 的区别_Go Web 编程如何确保Cookie数据的安全传输

    什么是Cookie Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上.通常, ...

  3. 在Vue2.0项目中与H5项目中获取、设置、清除cookie的一些注意点

    在vue中获取cookie 原生js方法没有直接获取cookie中值的,所以我在vue的项目中我自己写了个获取cookie值的方法(还有删除与设置cookie的方法还没去写,大家一起来补充完善) &l ...

  4. jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档。

    jquery.cookie 使用文档,$.cookie() 文档教程, js 操作 cookie 教程文档. jquery.cookie中的操作: jquery.cookie.js是一个基于jquer ...

  5. JavaScript读写Cookie

    Cookie作用 Cookie是一些name=value对数据,这些数据可以由浏览器写入用户的硬盘,也可以由浏览器从用户的硬盘读取.Cookie用来持久化记录用户的某些信息,如用户名和用户的喜好等等. ...

  6. html获取cookiejs,javascript设置和获取cookie的方法实例详解

    本文实例讲述了javascript设置和获取cookie的方法.分享给大家供大家参考,具体如下: 1. 设置cookie function setCookie(cookieName,cookieVal ...

  7. Cookie和Session-学习笔记02【Cookie案例、JSP改造Cookie案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] Cookie和Session-学习笔记01[Cookie_快速入门.Cookie_细节] Cookie和Session-学习笔记02[Cookie案例 ...

  8. html domin属性,cookie中的path与domain属性详解

    1.domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net.而跨域访问,如域A为t1 ...

  9. python 中cookie_Python 处理Cookie的菜鸟教程(一)Cookie库

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! Cookie用于服务器实现会话,用户登录及相关功能时进行状态管理.要在用户浏览器上安装cookie ...

最新文章

  1. “神仙”打架,“凡人”遭殃
  2. python 可视化界面_工具推荐 | 3维数据可视化
  3. Cannot assign a device for operation
  4. 神州数码c语言笔试题,神州数码 面试
  5. 解决msgfmt无法使用的问题
  6. VTK:可视化之LineWidth
  7. C/C++编程心得(二)
  8. 算法提高 日期计算c语言,算法提高 日期计算
  9. python到底是啥_Python语言中的__init__到底是干什么的?
  10. 结对-贪吃蛇-开发过程
  11. 三个优秀的PyTorch实现语义分割框架
  12. delphi控件属性大全-详解-简介
  13. 【并查集】亲戚(Relations)
  14. QT5编程入门教程(非常详细)
  15. 破解版超级数据恢复软件-内含已破解注册码
  16. y470 bios uefi_AMD又能开核?刷完BIOS后性能白给,这次血赚了
  17. 写一份竞品分析文档的思路(模板)
  18. windows使用detours实现进程拦截实操
  19. 阿里云主机的公网带宽和私网带宽的介绍
  20. Learn Git Branching 答案汇总

热门文章

  1. [翻译]估计硬件规模:为什么我们没有一个明确的答案?
  2. 面对二维码地推无法分辨地区之间的优劣,我们该怎么做!
  3. 从零开始学习linux的I2C设备驱动框架——写一个简单的SHT20驱动
  4. 2020G1工业锅炉司炉证考试及G1工业锅炉司炉作业模拟考试
  5. 《导航贴》- Unity手册,系统实战学习
  6. 2014-10-22威睿电通面试总结
  7. 【算法学习笔记】二分查找法
  8. LeetCode第1143题最长公共子序列
  9. The cycles per degree
  10. BTC反弹上攻失效 回踩重点关11000