Servlet的Cookie与Seesion的介绍

news/2024/5/18 13:42:59 标签: servlet, cookie, session

什么是Cookie?

Cookie是服务器在本地机器上存储的小段文本,它是一个简单的字符串形式的键值对。
网络服务器用HTTP头向客户端发送cookie
(一般情况下Cookie是由服务端生成的,当然js也能操作cookie)
在客户端,浏览器解析这些cookies并将它们保存到本地,
而后当浏览器访问这个服务器时,它会在任何请求上加上这些cookie
说白了就是每次你和服务器的交互都会带着这些cookie

什么是Session?

session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接。

然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”。

而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session


说的通俗一点~

Cookie
Cookie在服务器端产生的,以文件的形式保存在客户端的,客户端每次发送请求,都会将相应的Cookie发送给服务器端

session
创建于服务器端,保存于服务器,维护于服务器端,每创建一个新的Session,服务器端都会分配一个唯一的ID,并且把这个ID保存到客户端的Cookie中,保存形式是以JSESSIONID来保存的。

当浏览器被禁用Cookie的时候,session不能使用的时候,就采用重写URL,就是在URL地址后加上JSESSIONID
String url = response.encodeURL(path);
response.sendRedirect(url);


然后sessioncookie又有哪些关系呢?

我们知道session是在服务端的,http又是无状态协议,而seesion又是靠session id来区分的,
因此为了传递session id让服务器识别,这个session id就存放在了cookie中。
因为每次向服务器发送请求时,http头都会带着cookie
所以服务端就很方便地根据cookie读取出来的session id来区分各个请求的session

在Servlet代码中写上:

<span style="font-size:18px;">HttpSession session=request.getSession();</span>
这样就能创建一个session了~

用火狐访问,查看firebug的网络信息,我们可以发现他的响应信息中有
Set-Cookie JSESSIONID=5A810D07A1FB78122FFC2A74CA04F255; Path=/Test01/; HttpOnly
这些字样,这说明访问服务器的时候,服务端把seesion id写入到了cookie
让客户端浏览器把cookie保存起来。

到这里我们似乎可以发现些什么,不知道你看到没有?
发送请求的时候带着cookie信息,
从响应信息里我们又看到了让浏览器设置cookie的信息,发送请求响应

从而我们可以得出,在servlet中,想获得cookie,我们需要从request中取,
下面这段代码就可以在控制台中把客户端过来的cookie信息都打印出来。

TwoCookie:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Writer out=response.getWriter();
		//查找所有的Cookie,向服务器发送请求,来得到Cookie
		Cookie[]cookies=request.getCookies();
		if(cookies!=null){
			for(Cookie cookie:cookies){
				out.write(cookie.getName()+" "+cookie.getValue());
			}
		}else{
			out.write("cookie is null");
		}
	}

而当你想添加cookie时就得往response里添加。

OneCookie:

		//创建cookie
		Cookie c=new Cookie("keys", "T-Sshirt");
		c.setMaxAge(30);//30秒不改变,持久30秒
		response.addCookie(c);
添加了这个cookie后,你会在刚才控制台的cookie打印中看到你这个mycookie信息。

然后就可以在Session中写下以下代码:

OneSession:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session=request.getSession();
		session.setMaxInactiveInterval(30);
		request.setCharacterEncoding("UTF-8");
		String usrename=request.getParameter("username");
		session.setAttribute("name", usrename);
	}

TwoSession:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session=request.getSession();
		String name=(String) session.getAttribute("name");
		response.setCharacterEncoding("UTF-8");
		response.addHeader("Content-Type", "text/html; charset=UTF-8");
		Writer out=response.getWriter();
		out.write("name is"+name);
	}

index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index.jsp</title>
</head>
<body>
       <hr>
       <form action="OneSession" method="post">
           用户名:<input type="text" name="username"> <br>
           <input type="submit" value="登录">
       </form>
</body>
</html>
index.jsp是在webcontent目录下的,看下图:


OneCookie,TwoCookie,OneSession,TwoSession都是继承HttpServlet的~

先要在浏览器运行TwoCookie,然后运行项目下面的index.jsp跳转到OneSession,在运行TwoSession~

效果图如下:


最后讨论一下Session失效:
1.关闭浏览器的时候
2.httpSession.invalidate();
3.设置httpSession的最大存活期
a:httpSession.setMaxInactiveInterval(10);不活动时间为10秒
b: <session-config>
<session-timeout>30</session-timeout>
</session-config> 不活动时间30分钟


http://www.niftyadmin.cn/n/1870373.html

相关文章

python剑指offer系列滑动窗口的最大值

给定一个数组和滑动窗口的大小&#xff0c;找出所有滑动窗口里数值的最大值。例如&#xff0c;如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3&#xff0c;那么一共存在6个滑动窗口&#xff0c;他们的最大值分别为{4,4,6,6,6,5}&#xff1b;针对数组{2,3,4,2,6,2,5,1}的滑动窗…

ThreadLocal的理解和使用

1.ThreadLocal初步 早在JDK 1.2的版本中就提供java.lang.ThreadLocal&#xff0c;ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal很容易让人望文生义&#xff0c;想当然地认为是一个“本地线程”。…

python剑指offer系列层序遍历二叉树

class Solution:# 返回从上到下每个节点值列表&#xff0c;例&#xff1a;[1,2,3]def PrintFromTopToBottom(self, root):lists []if root None:returnque1 []que1.append(root)while que1:data que1.pop(0)if data.left ! None:que1.append(data.left)if data.right ! Non…

Content-Type引发的服务端收不到HTTP请求参数的问题

问题现象&#xff1a; 前端POST请求参数已经传过来了&#xff0c;Java后端Debug也能进到请求里&#xff0c;可就是取不到请求参数。 用Chrome 开发者工具可以看到请求的不同&#xff1a; 可以看到请求参数一个在Form Data中&#xff0c;一个在Request Payload中&#xff0c;而…

python剑指offer系列树的子结构

题目&#xff1a;输入两棵二叉树A&#xff0c;B&#xff0c;判断B是不是A的子结构。&#xff08;ps&#xff1a;我们约定空树不是任意一个树的子结构&#xff09;解法&#xff1a; 对于两棵二叉树来说&#xff0c;要判断B是不是A的子结构&#xff0c;首先第一步在树A中查找与B根…

C语言王国探险记之函数的简单概念

王国探险记系列 文章目录&#xff08;5&#xff09; 目录 王国探险记系列 文章目录&#xff08;5&#xff09; 前言 一&#xff0c;函数的基本概念 二&#xff0c;调用外部函数和main()函数区别 2.1如果我们将函数的定义放到后面&#xff0c;可不可以呢&#xff1f; 总结…

JavaWeb 三大器--Listener、Filter 和Interceptor 总结

说明&#xff1a;web.xml的加载顺序是&#xff1a;【Context-Param】->【Listener】->【Filter】->【Servlet】&#xff0c;而同个类型之间的实际程序调用的时候的顺序是根据对应的Mapping的顺序进行调用。 详细介绍&#xff1a;web.xml加载顺序与web.xml常用节点解析…

python剑指offer系列二叉树中和为某一值的路径

题目&#xff1a;输入一颗二叉树和一个整数&#xff0c;打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路&#xff1a; 其实就是深度优先遍历&#xff0c;到达叶子结点时判断target是否为零&#xff…