jsp的cookie技术整理

本文详细介绍了Cookie的工作原理,包括如何在JSP中创建和处理Cookie,以及Cookie的主要属性如域名、存活时间等。并通过实例展示了Cookie的设置与读取过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.jsp
web1下的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的信息。

<think>好的,我现在需要处理用户关于JSP技术基础知识点思维导图的请求。首先,回顾之前的对话历史,用户已经得到了一个较为详细的JSP知识点思维导图,包括基础、指令、动作、表达式语言、JSTL标签库、部署、会话管理和高级特性等。用户现在再次请求获取关于JSP技术基础的思维导图,但需要结合提供的引用内容。 首先,分析用户提供的引用内容。引用[1]提到了Java后端技术知识点汇总,包括JavaWeb相关知识点、集合、JVM、并发编程等思维导图链接。引用[2]则是关于学校课程重点整理,强调了解线性方程组的直接方法,但可能不直接相关。用户明确表示引用仅供参考,需要结合上一次的问题和回答。 用户当前的需求是获取JSP技术基础的思维导图,可能希望更详细或结构更清晰的内容。需要确保思维导图涵盖核心基础,并且符合用户之前提到的结构,比如生命周期、语法元素、内置对象、EL表达式、JSTL等。同时,用户可能希望思维导图能够帮助复习或教学,因此需要逻辑清晰,层次分明。 接下来,需要检查之前的回答是否遗漏了JSP基础的重要部分。之前的回答已经覆盖了JSP基础、指令、动作、EL、JSTL、部署、会话管理和高级特性,但可能可以进一步细化,例如将语法元素分为脚本元素、指令元素、动作元素,并更详细地说明每个部分的内容,比如脚本元素包括声明、脚本段、表达式等。此外,可以补充JSP的执行过程,从请求到响应的详细步骤,以及JSPServlet的关系。 用户可能希望思维导图更侧重基础,因此需要将重点放在JSP的基本概念、语法、执行流程、核心组件上,而高级特性如过滤器和监听器可以放在后面或单独部分。同时,考虑到引用[1]中的JavaWeb相关知识点,可能需要强调JSP在JavaWeb中的位置,以及与Servlet的协同工作。 还要确保回答符合用户之前的格式要求,使用中文,正确应用LaTeX格式,生成相关问题,并在引用处标注。需要确认之前的回答中已经正确添加了引用标识,并确保新回答中的引用正确对应。 最后,生成相关问题时要围绕JSP基础知识点,例如执行流程、语法差异、内置对象的使用等,帮助用户进一步巩固知识。同时,检查是否有冗余内容,确保回答简洁明了,结构清晰,符合用户的需求。</think>### JSP 技术基础知识点思维导图 以下是基于 JSP 核心技术整理的**基础知识点思维导图**,涵盖核心概念、语法、执行流程及关键组件: --- #### **1. JSP 核心概念** - **定义与作用** JSP(JavaServer Pages)是基于 Java 的服务器端动态网页技术,通过嵌入 Java 代码生成动态内容,本质上是 Servlet 的扩展[^1]。 - **与 Servlet 的关系** JSP 最终会被 Web 容器转译为 Servlet 并编译执行[^1]。 --- #### **2. JSP 生命周期** 1. **加载与初始化** - 容器加载 JSP 文件,生成对应的 Servlet 类。 2. **转译与编译** - 将 JSP 代码转为 `*.java` 文件(Servlet),再编译为 `.class` 文件。 3. **实例化与初始化** - 调用 `jspInit()` 方法(仅一次)。 4. **请求处理** - 调用 `_jspService()` 方法处理用户请求。 5. **销毁** - 调用 `jspDestroy()` 方法释放资源[^1]。 --- #### **3. JSP 语法元素** - **脚本元素** - **声明**:`<%! int count = 0; %>` 定义全局变量或方法。 - **脚本段**:`<% for(int i=0; i<5; i++) { ... } %>` 嵌入 Java 逻辑代码。 - **表达式**:`<%= new Date() %>` 输出动态内容(自动转换为字符串)。 - **指令元素** - **`<%@ page %>`**:设置页面属性(如 `contentType`、`errorPage`)。 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" %> ``` - **`<%@ include %>`**:静态包含其他文件(合并内容后编译)。 - **`<%@ taglib %>`**:引入标签库(如 JSTL)。 - **动作元素** - **`<jsp:include>`**:动态包含其他资源(运行时合并结果)。 - **`<jsp:forward>`**:将请求转发到另一个页面。 - **`<jsp:param>`**:传递参数给目标资源。 --- #### **4. JSP 内置对象** 无需声明直接使用的 9 大对象: | 对象名 | 类型 | 作用 | |--------------|-----------------------|-------------------------------| | `request` | `HttpServletRequest` | 获取客户端请求参数/头信息 | | `response` | `HttpServletResponse` | 控制响应输出(如重定向) | | `session` | `HttpSession` | 存储用户会话数据 | | `application`| `ServletContext` | 共享全局应用数据 | | `out` | `JspWriter` | 向客户端输出内容 | | `pageContext`| `PageContext` | 管理其他作用域对象及页面属性 | | `config` | `ServletConfig` | 获取 Servlet 配置信息 | | `page` | `Object` | 当前 Servlet 实例(`this`) | | `exception` | `Throwable` | 捕获页面异常(需设置 `isErrorPage=true`) | --- #### **5. 表达式语言(EL)** - **语法**:`${expression}` - 简化数据访问(如 `${user.name}` 等价于 `<%= user.getName() %>`)。 - **作用域查找顺序**: `pageScope` → `requestScope` → `sessionScope` → `applicationScope`。 - **隐式对象**: `param`(请求参数)、`header`(请求头)、`cookie` 等[^1]。 --- #### **6. JSTL 基础标签库** - **核心标签(Core Tags)**: ```jsp <c:if test="${condition}">...</c:if> <c:forEach items="${list}" var="item">...</c:forEach> ``` - **格式化标签(FMT Tags)**: 处理日期、数字本地化。 - **函数标签(Functions)**: 字符串操作(如 `fn:length()`)。 --- #### **7. JSP 执行流程示例** 1. 用户请求 `index.jsp`。 2. 容器检查是否已有对应的 Servlet 类: - 若无,转译 JSP 为 `index_jsp.java`,编译为 `index_jsp.class`。 3. 实例化 Servlet,调用 `_jspService()` 生成动态 HTML。 4. 响应发送至客户端[^1]。 --- ### 示例代码片段 ```jsp <%@ page contentType="text/html;charset=UTF-8" %> <html> <head> <title>JSP 基础示例</title> </head> <body> <%-- 脚本段示例 --%> <% String user = request.getParameter("user"); if(user == null) user = "Guest"; %> <%-- EL 表达式输出 --%> <h1>Welcome, ${user}!</h1> <%-- JSTL 标签示例 --%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="message" value="Hello JSP!" /> <p>Message: ${message}</p> </body> </html> ``` --- ### 相关问题 1. **JSPServlet 在动态内容生成上有何本质区别?** 2. **如何通过 `pageContext` 对象访问其他内置对象(如 `session` 或 `application`)?** 3. **为什么推荐使用 EL 和 JSTL 替代传统的脚本段(`<% %>`)?** [^1]: Java后端技术知识点汇总(思维导图)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值