`
dacoolbaby
  • 浏览: 1267567 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[转]从后端看Cookie

    博客分类:
  • Java
阅读更多

一、cookie的作用

在我们平常写的B/S程序中,会经常用到cookie,主要有以下一些作用:

1、 记录用户名和密码

以及该用户需要保存的一些信息,如购物购站,使用cookie,可以让用户自动登录到站点等。

2、 定制站点

可以使用cookie来记录用户的偏好。

3、 定向广告

可以使用cookie来记录用记经常访问的主题,并向他们显示与这些主题相关的广告。


二、向客户程序发送cookie

1、 创建cookie对象

Cookie c = new Cookie(“userId”,”landril”);

 

2、 设置最大时效,默认该cookie是存储在浏览器的内在中,用户关闭浏览器则被删除,下面的方法是将cookie存储在硬盘上。

c.setMaxAge(60*60*24);//一天,如果设置为0则是删除该cookie

 

3、 将cookie放入到HTTP响应报头,可以使用HttpServletResponse的addCookie方法,此方法不修改之前指定的Set-Cookie报头,而是创建新的报头。

response.addCookie(c);

 

注意:设置cookie的步骤为创建cookie对象,设置最大时效,将cookie放入响应报头,即发送到客户程序,记住一定要将cookie发送到客户程序

 

三、从客户端读取cookie

1、 调用HttpServletRequest的getCookies得到一个Cookie对象的数组
2、 对数组进行循环,调用cookie的getName方法,获取具体的cookie的值

Cookie[] cookies = request.getCookies();

if(cookies != null){
for(int i=0;i<cookies.length;i++){
        Cookie c = cookies[i];
        if(“userId”.equals(c.getName())){
        System.out.println(c.getValue());
}
}
}

 

四、cookie的常用方法

1、 setComment()/getComment():指定或查找与该cookie相关的注释
2、 setDomain()/getDomain():设置或读取该cookie适用的域
3、 setMaxAge()/getMaxAge():操作cookie保留的时间,多长时间后过期
4、 getName():读取cookie的名称
5、 setPath()/getPath():设置或取得cookie适用的路径 cookie.setPath(“/”);指定服务器的所有页面都应该收到该cookie
6、 setSource()/getSource():指定cookie是否只能通过加密连接(SSL)默认false,表示cookie适用所有连接
7、 setValue()/getValue():指定或获取cookie的值


五、使用cookie

1、RepeatServlet.java

public class RepeatServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {

        boolean newa = true;

        Cookie[] cookies = request.getCookies();
        if(cookies != null){
           for (int i = 0; i < cookies.length; i++) {
               Cookie c = cookies[i];
               if ((c.getName().equals("repeat")) && (c.getValue().equals("true"))) {
                  newa = false;
                   break;
               }
           }
       }

      
        String title;

       if (newa) {
           Cookie rtn = new Cookie("repeat"," true");
           rtn.setMaxAge(60*60*24*365);
           response.addCookie(rtn);
           title = "First Welcome";
       } else {
           title = "Welcom Back";
       }

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body><h3>");
        out.println(title);
        out.println("</h3></body></html>");

    }

    public void doPose(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
        doGet(request,response);

    }
}

 

2、CookieUtil.java
public class CookieUtil{

    public static String getValue(HttpServletRequest request,String cName,String value){
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
           for (int i = 0; i < cookies.length; i++) {
               Cookie cookie = cookies[i];
               if (cName.equals(cookie.getName())) {
                   return cookie.getValue();
               }
           }
       }
        return value;

    }

   

    public static Cookie getCookie(HttpServletRequest request,String cName){

        Cookie[] cookies = request.getCookies();
        if(cookies != null){
           for (int i = 0; i < cookies.length; i++) {
               Cookie cookie = cookies[i];

               if (cName.equals(cookie.getName())) {
                   return cookie;
               }
           }
       }
        return null;
    }

}

 

3、AccessCountServle.java 记录访问数

public class AccessCountServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {      

        String acount = CookieUtil.getValue(request, "acc", "1");
        int count = Integer.parseInt(acount);
        Cookie cookie = new Cookie("acc",String.valueOf(count+1));
        cookie.setMaxAge(60*60*24*365);
        response.addCookie(cookie);
      

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>Hello,the number is<h3>");
        out.println(count);
        out.println("</h3></body></html>");
    }

   

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        doGet(request,response);
    }

}
-------------------------------------------------------------------
把用户名写入Cookie
String userName1 = request.getParameter("userName");
String userName2  = new String(userName1.getBytes("ISO-8859-1"),"UTF-8");
String userName3 = URLEncoder.encode(userName2,"utf-8");//中文需要编码
Cookie cookie = new Cookie("cookieName",userName3);
cookie.setMaxAge(365*24*60*60);//存活期一年
response.addCookie(cookie);

读出Cookie里的数据
Cookie myCookie[]=request.getCookies();
for(int n = 0; n < myCookie.length-1; n++){
    Cookie newCookie= myCookie[n];
    String userName = newCookie.getName();
    if(userName.equals("cookieName")){
       String userName2 = newCookie.getValue();
       String userName3 = URLDecoder.decode(userName2,"UTF-8");
       System.out.println("你好,"+userName3);
    }
}

删除Cookie里的数据
Cookie deleteCookie = new Cookie("cookie",null);
deleteCookie.setMaxAge(0);
deleteCookie.setPath("/");
response.addCookie(deleteCookie);

 

什么是cookies?
  大家都知道,浏览器与WEB服务器之间是使用HTTP协议进行通信的,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。为了弥补这个缺陷,Netscape开发出了cookie这个有效的工具来保存某个用户的识别信息,因此人们昵称为“小甜饼”。cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段:Netscape Navigator使用一个名为cookies.txt本地文件保存从所有站点接收的Cookie信息;而IE浏览器把Cookie信息保存在类似于C:\\windows\\cookies的目录下。当用户再次访问某个站点时,服务端将要求浏览器查找并返回先前发送的Cookie信息,来识别这个用户。

  cookies给网站和用户带来的好处非常多:

  1、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
  2、Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
  3、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点
  4、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务

 

处理Cookie的属性需要注意的一些问题
通过上面两个简单的例子,可以看到,用JSP进行Cookie的操作,是非常简单的。不过我们在实际操作中还要注意一些问题:

 

1. Cookie的兼容性问题

Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。

 

2. Cookie的内容

同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定Cookie的内容为"Test_Content"的原因。
虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符。

分享到:
评论

相关推荐

    SpringBoot+vue 在后端给浏览器设置cookie

    前端的vue项目在这里我使用的是axios插件发请求...//向后端发送一个请求,用于获取cookie this.axios.get(/setCookies) .then(res =&gt;{ console.log(res) }) .catch(err =&gt;{ console.log(err); }) 后端SpringBoo

    cookie后台操作

    cookie的后台操作,这里是cookies的一个工具类 // 用户登录跳转 public String login() { if (cookieUtils.getCookie(request, userDao)) { return SUCCESS; } else return "login"; } @Override // ...

    关于java应用cookie

    这段代码会从请求中获取所有Cookie信息。 ##### 2. 判断并使用Cookie 接下来,可以根据获取到的Cookie信息来进行判断和处理: ```java boolean bool = false; String name = ""; String password = ""; if ...

    会话:软件包gorillasessions为自定义会话后端提供cookie和文件系统会话以及基础结构

    会议 gorilla / sessions为自定义会话后端提供cookie和文件系统会话以及基础结构。 主要功能是: 简单的API:将其用作设置签名(以及可选的加密)cookie的简便方法。 内置后端将会话存储在cookie或文件系统中。 ...

    web后端知识整理 初学者.zip

    【标题】"web后端知识整理 初学者.zip" 提供了一个针对初学者的Web后端技术学习资源,其中包含了核心概念、框架和技术栈的概述。这个压缩包中包含了一个名为"web后端.gmind"的文件,可以推测这是一个思维导图文件,...

    后端PHP面试题.docx

    ### 后端PHP面试知识点详解 #### 一、SESSION与COOKIE的区别 1. **协议角度**:HTTP协议本身是无状态的,这意味着服务器无法区分来自同一客户端的不同请求。为了克服这一限制,引入了SESSION和COOKIE机制。 2. **...

    云商城(带php后端)_php后端管理源码.zip

    "云商城(带php后端)_php后端管理源码.zip"是一个包含PHP后端管理系统的源代码压缩包,这通常是一个电子商务平台的后台管理系统,用于处理网站的运营、商品管理、订单处理、用户管理等核心功能。下面将详细阐述PHP...

    java web servlet服务后端框架

    首先,让我们来看看Java的Web服务器后端框架。这些框架如Spring MVC、Struts、JSF等,极大地简化了Web应用的开发过程。Spring MVC是目前最流行的框架之一,它提供了模型-视图-控制器(MVC)架构模式,使得业务逻辑、...

    完整的餐馆前端后端项目

    综合来看,这个项目展示了Web应用开发的全面流程,从用户交互到后端处理,再到数据库操作,涉及的技术和知识点广泛,对于学习和实践Web开发的人员来说具有很高的参考价值。通过这样的项目,开发者可以提升自己的全栈...

    servlet+vue后端代码

    2. **权限控制**:登录成功后,后端应返回一个令牌或Session ID,前端将其保存在Cookie或LocalStorage中,用于后续请求的权限验证。 综上,这个项目涵盖了Java后端开发、前端Vue.js应用以及前后端交互的基础知识,...

    CookiesjsJavaScript客户端的Cookie操作库

    作为客户端库,它使得开发者无需后端服务器参与就能创建、读取、更新和删除Cookie,增强了前端应用对用户状态的管理能力。 **标签解析:** "JavaScript开发-其它杂项" 暗示了Cookies.js是JavaScript开发工具的一...

    阿里系cookie加密(acw-sc-v2)算法 ZIP包案例为雪球Cookie加密

    JavaScript代码可能包含了在前端处理cookie加密的逻辑,而Python代码则可能是后端服务器用于解密接收到的加密cookie的实现。 JavaScript部分的加密算法代码可能涉及到对原始cookie值的预处理、哈希计算、非对称加密...

    计算机后端-PHP视频教程. php之thinkphp134 cookie加盐.wmv

    计算机后端-PHP视频教程. php之thinkphp134 cookie加盐.wmv

    计算机后端-PHP视频教程. http协议11 http协议与cookie.wmv

    计算机后端-PHP视频教程. http协议11 http协议与cookie.wmv

    axios携带cookie配置详解(axios+koa)

    然而,仅仅在客户端设置了`withCredentials`还不够,后端服务也需要进行相应的配置以允许跨域请求携带cookie。在Koa框架中,这通常通过设置响应头`Access-Control-Allow-Credentials`为`true`来实现。此外,当`...

    计算机后端-PHP视频教程. php之blog实战42-cookie计数器.wmv

    计算机后端-PHP视频教程. php之blog实战42-cookie计数器.wmv

    计算机后端-PHP视频教程. php之blog实战51-cookie安全.wmv

    计算机后端-PHP视频教程. php之blog实战51-cookie安全.wmv

    Java后端学习路线梳理(csdn)————程序.pdf

    在Java后端开发的学习旅程中,你需要掌握一系列的知识点,这些知识点构成了一个全面的学习路线。首先,我们需要关注的是编程基础,尤其是Java语言本身。Java的基础包括语言语法、面向对象编程、接口、容器、异常处理...

    axios中cookie跨域及相关配置示例详解

    本文将详细讲解如何在Axios中配置Cookie跨域以及相关的后端设置。 首先,我们要明确一点:默认情况下,Axios在发起跨域请求时并不会携带Cookie。这是因为浏览器的安全策略限制,为了防止跨站脚本攻击(Cross-Site ...

    Cookie记住用户名密码

    这个功能主要依赖于JavaScript和Cookie技术来实现,无需复杂的后端代码支持。下面我们将深入探讨这个功能的实现原理和步骤。 首先,Cookie是Web服务器在用户浏览器上存储的小型文本文件,用于在用户与服务器之间...

Global site tag (gtag.js) - Google Analytics