jsp的cookie技术整理

    技术2022-05-19  23

    Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109(已废弃),最新取代的规范是RFC2965。

     

    使用举例

      在jsp中创建简单的cookie:

      String cookiename="visitTimes";

      Cookie cookie=new Cookie(cookiename,"1");

      cookie.setMaxAge(10*60);//设置cookie存活期

      cookie.addCookie(cookie);//将cookie写入客户端

      在jsp中处理cookie数据的常用方法:

      getDomain();返回cookie的域名.

      getMaxAge();返回cookie的存活时间

      getName();返回cookie的名字

      getPath();返回cookie适用的路径

      getSecure();如果浏览器通过安全协议发送Cookie将返回true值,如果浏览器使用标准协议刚返回false值

      getValue();返回cookie的值

      getVersion();返回cookie所遵从的协议版本

      setComment(String purpose);设置cookie的注释

      setPath(String url);设置Cookie的适用路径

      setSecure(Boolean flag);设置浏览器是否仅仅使用安全协议来发送cookie,例如使用Https或ssl

      setValue(String newvalue);cookie创建后设置一个新的值

      setVersion(int v);设置cookie所遵从的协议版本.

     

    对于cookie,最主要的当然是读取和设置了,下面分两方面说明.一、设置Cookie是通过HttpServletResponse的addCookie方法加入到Set-Cookie应答头中的例如:Cookie userCookie = new Cookie("user", "admin"); response.addCookie(userCookie);和设置有关系的还有以下两个重要方法1.setMaxAge设置Cookie过期之前的时间,以秒计。如果不设置该值,则Cookie只在当前会话内有效,而且这些Cookie不会保存到磁盘上。注意:删除cookie就是通过该方法实现的。将要删除的cookie的过期之前的时间指定为0就可以达到删除该cookie的目的。2.setPath设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面(JSP页面或者Servlet的映射)所在目录及其子目录下的所有页面。注意:A:所有的cookie都是有路径的B:该方法设置的路径为客户端路径,即“/”代表服务器根目录,而不是WEB应用根目录C:该方法设置路径时,“/myWeb/”与“/myWeb”是不同的,要特别注意;前者可以关联到服务器的myWeb目录下,而或者则不可以。D:该方法设置路径时,没有相对目录可言,即不论在哪个目录下设置setPath(“/myWeb/”),该cookie都将关联到服务器的myWeb目录下(setPath(“/myWeb”)则不可以),而不是当前目录的myWeb的子目录下;同样,设置setPath(“myWeb/”)和setPath(“myWeb”)也不能关联到当前目录的myWeb的子目录下这里有个奇怪的例子,就是在一个web应用下设置的cookie可以在另一个web应用下获得(两个web应用在同一个服务器下)目录结构:在服务器根目录上有web1和web2两个目录,在web1下有setcookie.jsp和getcookie.jsp、在web2下有getcookie.jspweb1下的setcookie.jsp<%Cookie userCookie = new Cookie("user", "admin"); userCookie.setMaxAge(24*60*60);userCookie.setPath("/web2/");response.addCookie(userCookie);%>web1下的getcookie.jsp<%Cookie[] cookie = request.getCookies();String user = new String();if ( cookie != null ) {for (int i = 0; i < cookie.length; i++) {Cookie myCookie = cookie[i];if (myCookie.getName().equals("user")) {user = myCookie.getValue();}}}out.println("user = " + user);%>web2下的getcookie.jsp<%Cookie[] cookie = request.getCookies();String user = new String();if ( cookie != null ) {for (int i = 0; i < cookie.length; i++) {Cookie myCookie = cookie[i];if (myCookie.getName().equals("user")) {user = myCookie.getValue();}}}out.println("user = " + user);%>先访问web1下的setcookie.jsp,然后分别访问web1和web2下面的getcookie.jsp文件,你会发现奇怪的现象,web1下的getcookie.jsp中user为空而web2下的getcookie.jsp中user却有值,这就实现了从一个web应用下设置的cookie在另一个web应用下获得。大多数人删除cookie不成功都是因为目录原因。一个典型的原因是在某一个目录中设置了cookie(没有调用setPath方法)却在另一个目录中删除该cookie(其实是调用setMaxAge方法)

    二、读取从客户端读取Cookie时调用的是HttpServletRequest的getCookies方法。该方法返回一个与HTTP请求头中的内容对应的Cookie对象数组。得到这个数组之后,一般是用循环访问其中的各个元素,调用getName检查各个Cookie的名字,直至找到目标Cookie。然后对这个目标Cookie调用getValue,根据获得的结果进行其他处理。注意:若JSP和Servlet所在目录(Servlet为其映射目录)的父目录中有同名cookie,则request.getCookie()方法得到的Cookie数组中保存的是其父目录中的cookie的信息。


    最新回复(0)