草庐IT

06.《Java EE笔记》JSP Cookie 技术

一直流浪 2023-09-23 原文

参考链接:https://www.runoob.com/jsp/jsp-cookies.html

1. 概念

Cookie 是存储在客户机的文本文件,它们保存了大量轨迹信息。在 Servlet 技术基础上,JSP 显然能够提供对 HTTP cookie 的支持。

Cookie是保存在客户端的小文本,保存的位置分两种

  • Cookie可能保存在客户端浏览器的所占内存中,关闭浏览器后,Cookie就不再存在
  • Cookie也可能保存在客户PC机的硬盘上,设置有效时间,超过有效时间后失效

2. Servlet 中 Cookie的方法

  • public void setDomain(String pattern)
  • 设置 cookie 的域名,比如 runoob.com
  • public String getDomain()
  • 获取 cookie 的域名,比如 runoob.com
  • public void setMaxAge(int expiry)
  • 设置 cookie 有效期,以秒为单位,默认有效期为当前session的存活时间
  • public int getMaxAge()
  • 获取 cookie 有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为
  • public String getName()
  • 返回 cookie 的名称,名称创建后将不能被修改
  • public void setValue(String newValue)
  • 设置 cookie 的值
  • public String getValue()
  • 获取cookie的值
  • public void setPath(String uri)设置 cookie 的路径,默认为当前页面目录下的所有 URL,还有此目录下的所有子目录
  • public String getPath()
  • 获取 cookie 的路径
  • public void setSecure(boolean flag)
  • 指明 cookie 是否要加密传输
  • public void setComment(String purpose)
  • 设置注释描述 cookie 的目的。当浏览器将 cookie 展现给用户时,注释将会变得非常有用
  • public String getComment()
  • 返回描述 cookie 目的的注释,若没有则返回 null

2.1 Servlet 中设置 cookie

(1)创建一个 cookie 对象:

Cookie cookie = new Cookie("key","value");

//创建Cookie对象
Cookie userNameCookie = new Cookie("username", "86_god");
Cookie passwordCookie = new Cookie("password", "123456");

注意:名称和值中都不能包含空格或者如下的字符:[ ] ( ) = , " / ? @ : ;

(2)设置有效期:setMaxAge() 函数表明 cookie 在多长时间(以秒为单位)内有效。

//设置有效期
userNameCookie.setMaxAge(60*60*24*7);
passwordCookie.setMaxAge(60*60*24*7);

(3)将 cookie 发送至 HTTP 响应头中:调用 response.addCookie() 函数来向 HTTP 响应头中添加 cookie。

//发给浏览器保存
response.addCookie(userNameCookie);
response.addCookie(passwordCookie);

代码演示:(利用servlet设置cookie和查询cookie)

AddCookieServlet.java文件 设置cookie

package com.company.project.servlet;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/add-cookie-servlet")
public class AddCookieServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
        public AddCookieServlet() {
            super();

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

        //创建Cookie对象
        Cookie userNameCookie = new Cookie("username", "张三");
        Cookie passwordCookie = new Cookie("password", "23456");
        
        //设置有效期
        userNameCookie.setMaxAge(60*60*24*7);
        passwordCookie.setMaxAge(60*60*24*7);

        //发给浏览器保存
        response.addCookie(userNameCookie);
        response.addCookie(passwordCookie); 
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

ReadCookieServlet.java查询cookie

package com.company.project.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/read-cookie-servlet")
public class ReadCookieServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
  
    public ReadCookieServlet() {
        super();
        
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            //打印cookie对象
            System.out.println("cookie对象:" + cookie);
            
            //返回描述 cookie 目的的注释,若没有则返回 null
            System.out.println("cookie 目的的注释:"+cookie.getComment());
            
            //获取 cookie 的域名,比如 runoob.com
            System.out.println("cookie 的域名:"+cookie.getDomain());
            
            //获取 cookie 有效期
            System.out.println("cookie 有效期:"+cookie.getMaxAge());
            
            //返回 cookie 的名称
            System.out.println("cookie cookie 的名称:"+cookie.getName());
            
            //获取 cookie 的路径
            System.out.println("cookie 的路径:" + cookie.getPath());
            
            //获取 cookie 是否是加密传输
            System.out.println(" cookie 是否是加密传输:"+cookie.getSecure());
            
            //获取cookie的值
            System.out.println("cookie的值:"+cookie.getValue());
            
            //获取cookie的版本
            System.out.println("cookie的版本:"+cookie.getVersion());
        }
        
    }

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

(4)使用 JSP 删除 cookie

删除 cookie 非常简单。如果您想要删除一个 cookie,按照下面给的步骤来做就行了:

  • 获取一个已经存在的 cookie 然后存储在 Cookie 对象中。
  • 将 cookie 的有效期设置为 0。
  • 将这个 cookie 重新添加进响应头中。

(2)代码演示:模拟登录界面(登录成功后自动保存用户名和密码,方便页面读取用户信息)

login.html 表单提交数据

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<body>

<form action="main.jsp" method="post">
用户名: <input type="text" name="username">
<br />
密码: <input type="password" name="password" />
<input type="submit" value="提交" />
</form>

</body>
</html>

注销LogoutServlet.java,删除cookie的用户数据

package com.company.project.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/logout-servlet")
public class LogoutServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public LogoutServlet() {
        super();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if (cookies[i].getName().equals("username")) {
                    cookies[i].setMaxAge(0);
                }
                if (cookies[i].getName().equals("password")) {
                    cookies[i].setMaxAge(0);
                }
            }
        }
        request.getRequestDispatcher("main.jsp").forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }
}

通过main.jsp设置和获取cookie

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<%
   // 编码,解决中文乱码   
   request.setCharacterEncoding("utf-8");
   response.setCharacterEncoding("utf-8"); 
   response.setContentType("text/html;charset=utf-8");
   // 设置 name 和 url cookie 
   Cookie username = new Cookie("username",
           request.getParameter("username"));
   Cookie password = new Cookie("password",
              request.getParameter("password"));

   // 设置cookie过期时间为24小时。
   username.setMaxAge(60*60*24); 
   password.setMaxAge(60*60*24); 

   // 在响应头部添加cookie
   response.addCookie( username );
   response.addCookie( password );
%>
<html>
<head>
<title>设置 Cookie</title>
</head>
<body>



<% 
String name = "";
Cookie[] cookies = request.getCookies();
if(cookies != null){
    for(int i = 0;i<cookies.length;i++){
        if(cookies[i].getName().equals("username")){
            name = cookies[i].getValue();
        }
    }
}
%>

<h1>欢迎,
<%
if(name.equals("")){
%>
    <a href = "login.html">点击登录</a>
<%
}else{
%>
<%=name%>
<a href="logout-servlet">注销</a> 
<%
}
%>

</body>
</html>

有关06.《Java EE笔记》JSP Cookie 技术的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  4. ruby-on-rails - 用于门户的 Ruby 技术 - 2

    我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它

  5. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  6. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  7. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  8. ruby - 使用哪种群发消息技术? - 2

    我感到有点困惑——大约24小时以来,我一直在考虑在我的项目中使用哪种组播技术。基本上,我需要的是:创建组(通过一些后端进程)任意客户端广播消息(1:N,N:N)(可能)直接消息(1:1)(重要)使用我自己的后端(例如,通过某种HTTPAPI)对客户端进行身份验证/授权能够通过后端进程(或服务器插件)踢出特定的客户端这是我要的:Ruby或Haxe中的后端相关流程JS+Haxe(Flash9)中的前端—在浏览器中,因此理想情况下通过80/443进行通信,但不一定。因此,这项技术必须能够在HaxeforFlash中轻松访问,最好是Ruby。我一直在考虑:RabbitMQ(或OpenAMQ)、

  9. 企业大数据发展面临问题之存算分离技术思考 - 2

    文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据

  10. 【JAVAEE】JAVA数据库连接(JDBC) - 2

    1.什么是JDBC?Java数据库连接,(JavaDatabaseConnectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是SunMicrosystems的商标。我们通常说的JDBC是面向关系型数据库的。简而言之,JDBC就是JDK提供的关于数据库操作的一套接口规范,不同数据库厂商来负责实现这个接口,完成指定的操作。用程序和数据建立连接,分为三步骤:1.连接数据库2.执行SQL语句3.把查询到的结果集转换成JAVA对象2.对于MySQL的JDBC编程的前期准备工作知识拓展:JAR文件(Java归

随机推荐