cookie、session的配置和使用

1 cookie

1.1 什么是cookie

  1. 就是一个键值对用来存储少量的数据的字符串。
  2. 存在于客户的电脑上,每个客户向服务发送请求都会发送这个 cookie
  3. 可以使用 js 和 jquery 设置和读取cookie

1.2 读取和设置cookie

1.2.1 前端
<script>
// 函数中的参数分别为 cookie 的名称、值以及过期天数
function setCookie(c_name,value,expiredays){
    var exdate=new Date();
    exdate.setDate(exdate.getDate()+expiredays);
    document.cookie=c_name+ "=" +escape(value)+
    ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}
setCookie('name','zzyn',1); // cookie过期时间为1天。
</script>

读取 cookie

// 函数中的参数为 要获取的cookie键的名称。
function getCookie(c_name){
    if (document.cookie.length>0){
        c_start=document.cookie.indexOf(c_name + "=");
        if (c_start!=-1){
            c_start=c_start + c_name.length+1;
            c_end=document.cookie.indexOf(";",c_start);
            if (c_end==-1){ 
                c_end=document.cookie.length;
            }

            return unescape(document.cookie.substring(c_start,c_end));
        }
     }
    return "";
}
var uname= getCookie('name');
1.2.2 后端
如何创建cookie

在这里插入图片描述
浏览器给服务器发送请求时,如果浏览器中储存的有服务器发送的cookie值,就会将cookie值作为请求得一部分发送给服务器,没有就算了。而服务器方面,每次至少会有一个 cookie 被发送(就是session 会话的值),而在此基础上,后端程序员也可以修改cookie的值,或者添加新的 cookie 键值对。
之后服务器就会通过响应将 cookie 发送给浏览器,并被浏览器储存,至于时间由可以在服务器创建时,当然可以设置的不只时间,还有允许的路径。

protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
	//1 创建 Cookie 对象
	Cookie cookie = new Cookie("key4", "value4"); 
	//2 通知客户端保存 
	Cookie resp.addCookie(cookie); 
	//1 创建 Cookie 对象 
	Cookie cookie1 = new Cookie("key5", "value5"); 
	//2 通知客户端保存 
	Cookie resp.addCookie(cookie1); 
	resp.getWriter().write("Cookie 创建成功"); 
}

**注意:**这里createCookie的方法并不是servlet接口自带的,而是通过在doGetdoPost方法中通过前后端约定好的 action参数,通过反射实现方法的调用。代码如下

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String action = req.getParameter("action");
        try {
            // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            // 调用目标业务 方法
            method.invoke(this, req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这样调用方法,可以保证代码具有较高的可读性,虽然后面基本不会使用到这样的技巧

如何获得cookie

浏览器向客户端发送请求时就会向服务器发送 cookie,服务器也可以通过cookie值进行一些对应的操作。
在这里插入图片描述
为了保证代码的可重用,可以单独将判断的过程写到工具类当中。

public class CookieUtils {
	/**
	* 查找指定名称的 Cookie 对象 
	* @param name 
	* @param cookies 
	* @return 
	*/ 
	public static Cookie findCookie(String name , Cookie[] cookies)
	{ 
		if (name == null || cookies == null || cookies.length == 0) { 
			return null; 
		}
		for (Cookie cookie : cookies) { 
			if (name.equals(cookie.getName())) { 
			return cookie;
			} 
		}
		return null; 
	}
}

Servlet实现代码:

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
	Cookie[] cookies = req.getCookies(); 
	for (Cookie cookie : cookies) { 
		// getName 方法返回 Cookie 的 key(名) 
		// getValue 方法返回 Cookie 的 value 值 
		resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>"); 
	}
	Cookie iWantCookie = CookieUtils.findCookie("key1", cookies); 
	//判断是否为空,并调用,上面写的方法
	if (iWantCookie != null) { 
		resp.getWriter().write("找到了需要的 Cookie"); 
	} 
}
如何修改cookie

方法一:创建新的 cookie 替代旧的 cookie

// 1、先创建一个要修改的同名的 Cookie 对象 
// 2、在构造器,同时赋于新的 Cookie 值。
Cookie cookie = new Cookie("key1","newValue1"); 
// 3、调用 response.addCookie( Cookie ); 通知 客户端 保存修改 
resp.addCookie(cookie);

方法二:直接修改原来的 cookie 并响应个原来的方法。

// 1、先查找到需要修改的 Cookie 对象 
Cookie cookie = CookieUtils.findCookie("key2", req.getCookies()); 
if (cookie != null) { 
	// 2、调用 setValue()方法赋于新的 Cookie 值。 
	cookie.setValue("newValue2"); 
	// 3、调用 response.addCookie()通知客户端保存修改 
	resp.addCookie(cookie); 
}
如何查看浏览器中的 cookie

按下 F12 就可弹出,一下窗口,这是edge,不同的浏览器会有不同的工作区会有不同的名字,具体情况具体分析。
在这里插入图片描述

如何设置cookie的生命周期

cookie的生命周期是真正的时间
可以使用 setMaxAge(long time);以秒为单位。

  1. 如果time是正数表示,则默认为指定关闭的秒数。
  2. 如果是负数,表示关闭浏览器自动清理 cookie,默认为 -1
  3. 0 马上删除cookie
/**
* 设置存活 1 个小时的 Cooie 
* @param req 
* @param resp 
* @throws ServletException 
* @throws IOException 
*/
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
	Cookie cookie = new Cookie("life3600", "life3600"); 
	// 设置 Cookie 一小时之后被删除。无效 
	cookie.setMaxAge(60 * 60); 
	resp.addCookie(cookie); 
	resp.getWriter().write("已经创建了一个存活一小时的 Cookie"); 
}
设置 cookie 的有效路径

这样设置的目的是为了,保证,cookie 只有在特定路径下才可以被浏览器使用,以防止出现不必要的麻烦。起过滤作用

CookieA path=/工程路径
CookieB path=/工程路径/abc

请求地址如下:
http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送

路径默认为是项目的工程路径

protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	Cookie cookie = new Cookie("path1", "path1"); 
	// getContextPath() ===>>>> 得到工程路径 
	cookie.setPath( req.getContextPath() + "/abc" ); 
	// ===>>>> /工程路径/abc 
	resp.addCookie(cookie); 
	resp.getWriter().write("创建了一个带有 Path 路径的 Cookie"); 
}

2 Session 会话

2.1 概念

  1. 代码表现是 Session 就是一个接口
  2. Session 用来维护客户端和服务器之间的一种关联
  3. 每个客户端都有一个会话,存储在服务器中。
  4. 常用来保存用户登录之后的信息。

2.2 创建和获取Session

创建和获取写在一起,是因为这两个使用同一个方法。
Session request.getSession()
第一次调用:创建Session
之后就是获取
boolean session.isNew()判断是否是新创建出来的。
true 是刚创建
false 不是刚创建

  1. 向Session中设置数据
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	//设置 Session 中的数据为 key1-value1
	HttpSession session = req.getSession().setAttribute("key1", "value1");
	//查看默认超时时长
	int time = session.getMaxInactiveInterval();
	//设置超时时长 
	session.setMaxInactiveInterval(3);//以秒为单位,此为3秒
	//让session 马上超时 
	//session.inValidate();

	//获得 session 中存储的数据
	session.getAttribute("key1");
	resp.getWriter().write("已经往Session中保存了数据");
}

除了以上获得的数据还有一个就是 Session 的id,每一个Session 都有一个独一无二的 ID ,而通过cookie行浏览器呈递的就是这个cookie。
tomcat 默认session的超时时长为 30 秒。如果想修改,可以在 tomcat 服务器下的 web.xml 文件中配置。

<session-config> 
	<session-timeout>20</session-timeout> 
</session-config>

尚硅谷国哥

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值