Cookie

Posted 10000miles

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cookie相关的知识,希望对你有一定的参考价值。

  • 什么是cookie

  Cookie可以看作是容器中的一个工具类,只是封装了一些头部有关的属性,单独择出来封装为一个类(我自己的理解)也可以从会话概念入手:就像日常的会话一样,话题进行的每个阶段必然都会产生一些状态或flag,作为会话进行的依据。session和cookie就是用来在会话双方保存这些flag的对象。

       (其实也完全可以自己写一个javabean用来作为该对象,但是这样不能保证通用性,且还要在页面中被传来传去,既然是服务器当然就做一些周全的服务,规范和标准,抽象程度越高通用性就越高;也可以使用数据库,想一想将会增加多少连接次数)

  • cookie应用代码

  结构目录

  技术分享图片

    login.java

package com.example.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//服务端并不保存cookie对象,仅仅是封装了头部一个属性,在发送和获取时使用该封装
public class Login extends HttpServlet{
    
    private static final long serialVersionUID = 5028881790713553760L;
    
    public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException {
        res.setContentType("text/html");
        res.setCharacterEncoding("utf-8");
        String name = req.getParameter("username");
        System.out.println("登陆成功,省略跳转首页,用户名是:"+name);
        Cookie cookie = new Cookie("username",name);
        res.addCookie(cookie);//下面随便发送一些内容给浏览器;当客户端已存在cookie时也可以jsp中req无如何访问cookie,但是根据mvc设计理念jsp中不应该访问!!
        res.getWriter().println("你好cookie小甜饼已经送达请允许浏览器接受保存,只要你访问该地址时,浏览器会找到匹配的cookie作为请求状态发送给我,我就知道你是谁了");
    
    }
}

    只要在描述符中填充该对应标签,就可以访问了,由容器提供给res一个cookie对象,它封装了响应首部的会话部分,跟随响应发送给客户端,测试后查看浏览器控制台:响    应首部中携带着setcookie,浏览器会把其保存在硬盘或内存中,以后的请求中,只要用户不强制清除缓存或者关闭浏览器、cookie失效等,访问该地址时请求首部都会携带    该cookie信息。下面的程序是获取cookie,因为同属一个应用,所以可以获取到。

    havaCookie.java:

技术分享图片
package com.example.web;
import java.io.IOException;import java.net.HttpCookie;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//首先登陆案例,系统需要一直时登陆状态!也可以假设其是过滤器,每个sev执行之前都要进行过滤判断
public class havaCookie extends HttpServlet{
    
    public void doGet(HttpServletRequest req,HttpServletResponse res) 
            throws IOException, ServletException{
        res.setCharacterEncoding("utf-8");
        res.setContentType("text/html");
        Cookie[] ck = req.getCookies();//应用可能给客户端许多ck对象,我们
        if(ck == null) {//未登陆,进入登陆页面(重定向模拟一下即可!)
            res.sendRedirect("login.do?username=‘xiaolifeidao‘");
            System.out.println("打印说明cookie为null");
        }else {//已登陆,重置失效时长,并重定向到请求地址,这里不获取地址,直接指定一个
            System.out.println("进来说明cookie非null");
            for(int i=0;i<ck.length;i++) {
                Cookie cook = ck[i];
                System.out.println("打印说明程序在便利cookie");
                if(cook.getName().equals("username")){
                    
                    String username = cook.getValue();
                    System.out.println("是登陆状态,过滤器已经获取到cookie:"+username);
                    res.sendRedirect("process.do?username=xiaolifeidao");
                    cook.setMaxAge(10);
                    
                    //查看cookie的其他属性,测试一下
                    System.out.println("下面是ck的domain:"+cook.getDomain()+"ck的maxage"+cook.getMaxAge()
                                       +"ck的有效路径"+cook.getPath()+"版本"+cook.getVersion());
                    
                }
            }
        }
        
        
        res.getWriter().println("程序已经执行完毕!");
    }
}
View Code

    上面的程序是对cookie的获取,当用户浏览器已经保存了cookie信息后,只要之前的前提条件成立发送中都携带请求,测试请求该地址,浏览器控制台中会发现该请求携带    首部携带者cookie信息,然后程序中req就可以的到解析出来的cookie对象。值得注意的是:getcookies获取的是一个数组,因次需要遍历查找。这个程序可以假想为登陆合    法验证程序或者过滤器(虽然里面并没有这部分逻辑代码),验证合法后重定向到另一个程序(设想为欢迎页面或首页,或一个具体的应用逻辑),这样一个会话过程就开    始了。

    Process.java:

技术分享图片
package com.example.web;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Process extends HttpServlet{
      
    private static final long serialVersionUID = 2856962985282606619L;

    public void doGet(HttpServletRequest req,HttpServletResponse res){
          System.out.println(req.getParameter("username")+"已经付款成功!");
      }
}
View Code

    总结:cookie是不保存在服务端的,它只是对首部的封装,在没有其他内容了,这就是cookie,具体方法略去不表,了解其本质的前提下在应用中具体发挥就可以了。

以上是关于Cookie的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript单行代码,也就是代码片段

XSS:如何从 C# 中的字符串中删除 JS 片段?

Django cookie 横幅:window.wpcc 未定义

最详细的cookie和浏览隐私之间的关系

c#如何采集需要登录的页面

IE无法获得cookie,ie不支持cookie的解决办法,火狐支持