JavaWeb-Cookie和Session

Posted torain

tags:

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

Cookie和Session

  • 无状态协议:Http是无状态协议,是指当浏览器发送请求给server的时候,server响应,可是同一个浏览器再发送请求给server的时候,他也会响应,可是他不知道你就是刚才那个浏览器,简单地说就是server不会去记得你,所以是无状态协议。而DNS是有状态协议 。
  • 会话技术
    1、为了解决无状态的的弊端,因此需要会话技术来使服务器区分客户端。
    2、从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。

Cookie的处理

  • 服务器向客户端发送Cookie
  • 服务器接受客户端的Cookie

创建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);

注意!Cookie中不能存放中文

|方法|说明| |---|---| |cookie.setMaxAge(int seconds)|设置持久化时间后Cookie会存储到磁盘文件中,时间到即销毁;不设置时间Cookie存放在内存中,会话结束Cookie销毁| |cookie.setPath(String path)|设置在哪些路径中会携带Cookie信息| |response.addCookie(Cookie cookie)|向客户端发送cookie| **删除Cookie**:使用同名同路径的持久化时间为0的cookie进行覆盖即可(将持久化时间设置为0) **服务器端接收客户端携带的Cookie** > * 在请求时cookie信息放到请求头中发送到客户端: 1、通过request获得所有的Cookie: `Cookie[] cookies = request.getCookies();` 2、遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie ```java for(Cookie cookie : cookies){ if(cookie.getName().equal(cookieName)){ String cookieValue = cookie.getValue(); } } ```

java代码
在CookieTest中存入Cookie,再到GetCookieInfo中获取

package com.torain.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;

public class CookieTest extends HttpServlet {
	/**
	 * 在本Servlet中持久化Cookie
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取Cookie对象
		Cookie cookie = new Cookie("goods","iPad");
		// 设置持久化时间
		cookie.setMaxAge(10*60);
		// 设置作用域
		cookie.setPath("/WEBTEST");
		// 发送Cookie
		response.addCookie(cookie);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
package com.torain.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;

public class GetCookieInfo extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取Cookie
		Cookie[] cookies = request.getCookies();
		// 遍历Cookie获取goods值
		for(Cookie cookie : cookies) {
			if (cookie.getName().equals("goods")) {
				response.getWriter().write(cookie.getValue());	
			}
		}
	}

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

Session

获取Session对象
HttpSession session = request.getSession();
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)
session存取数据
session也是一个域对象使用域对象通用方法
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);

Session对象的声明周期
创建

  • 第一次执行request.getSession()时创建

销毁

  • 服务器关闭时
  • Session过期(默认30分钟)
  • 手动销毁session.invalidate();

总结:session是保存在服务器上的,而会话关闭后服务器上的session域无人认领只能等待自动销毁,将JESSIONID借助Cookie持久化到客户端中,就可以再次使用session域

Session-java代码

package com.torain.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;
import javax.servlet.http.HttpSession;

public class SessionServletA extends HttpServlet {
	/**
	 * 获取一个Session对象,存入值
	 * 将Session的JESSIONID持久化到客户端
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取Session对象
		HttpSession session = request.getSession();
		// 向Session域中存值
		session.setAttribute("name", "张三");
		// 将Session的JSESSIONID持久化到客户端
		String id = session.getId();
		Cookie cookie = new Cookie("JSESSIONID",id);
		// 持久化时间3分钟
		cookie.setMaxAge(180);
		// 发送Seesion
		response.addCookie(cookie);;
		// 打印
		response.getWriter().write("JSESSIONID:" + id);
		
	}

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

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

javaweb-cookie&session(未处理)

AndroidStudio3.0无法打开Android Device Monitor的解决办法(An error has occurred on Android Device Monitor)(代码片

小程序session_key和access_token区别

小程序session_key和access_token区别

Cookie & Session会话管理与控制

Memcache+cookie实现模拟session