会话(状态)管理Cookie与Session(二)

会话(状态)管理Cookie与Session(二)

本章接上一章 https://blog.youkuaiyun.com/qq_34598667/article/details/83012671 Cookie之后继续讲解Session


Session运行原理

1、浏览器发送请求给服务器,服务器创建一个session对象,每一个session对象都有一个唯一的标识sessionId
2、服务器发出响应时把sessionId以cookie消息头的方式发送给浏览器,浏览器保存此cookie(sessionId)
3、当浏览器再次发送请求时会把sessionId以cookie消息头的方式发送给服务器,服务器会根据此id找到相应的session对象去执行相应的操作

服务器默认情况下会为每个用户浏览器创建一个单独的会话对象(session对象),此session对象只为该浏览器服务

Session应用

1、创建session对象
HttpSession s = request.getSession(boolean flag);
	flag取值:
		true:当flag为true时,先查看请求中有没有SessionId,
			 a)如果没有 SessionId,创建一个Session对象
			 b)如果有SessionId,依据 SessionId查找对应Session对象,找到则返回,找不到则创建一个新 的Session对象
			 所以flag为true时,一定能得到一个Session对象 ,默认值,可以不写
			false:没有SessionId及有SessionId但没有找到Session 对象,均返回null;有SessionId并且能找到则返回

新建一个Servlet,用于创建session并绑定数据

@WebServlet(urlPatterns={"/session"})
public class SessionServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//得到session对象
		HttpSession session=req.getSession();
		//绑定数据
		session.setAttribute("code", "admin");
	}
}

在浏览器上查看
在这里插入图片描述


2、获取session对象,查看绑定数据
@WebServlet(urlPatterns={"/getSession"})
public class GetSessionServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//得到session对象
		HttpSession session=req.getSession();
		//查看sessionId和绑定数据code
		System.out.println(session.getId());
		System.out.println(session.getAttribute("code"));
	}
}


3、删除Session对象
@WebServlet(urlPatterns={"/invalidateSession"})
public class InvalidateSessionServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//得到session对象
		HttpSession session=req.getSession();
		//删除session
		session.invalidate();
	}
}

先访问/session,在查看/getSession,再删除/invalidateSession,浏览器查看cookie消息头中的sessionId


Session对象的生命周期

1、Session对象是在什么时候被创建的?是在浏览器访问服务器时吗?

不是的。session的创建时机是在程序中第一次去执行request.getSession();时服务器才会为你创建session。

2、Session对象什么时候被销毁?关闭浏览器,会话结束,session是不是就销毁了呢?

不是的,session的销毁有两种情况
1、session存在达到指定时长没有人使用。一般默认为是30分钟会自动销毁,可设置
2、调用session.invalidate()手动销毁

3、如何手动设置session时长?

两种方式
1)通过修改web.xml配置文件

 	<!-- 设置Session的有效时间:以分钟为单位-->
 	<session-config>
    	<session-timeout>10</session-timeout>
  	</session-config>

2)调用session.setMaxInactiveInterval(int seconds)方法来实现

//单位为秒 指定时间内无人使用会被自动销毁
session.setMaxInactiveInterval(10);

浏览器禁用Cookie后的session处理

1、如果浏览器禁用Cookie,Session还能用吗?

因为sessionId是以Cookie的方式存储的,所以不能,但是可以使用其他方式来发送sessionId,例如URL重写

2、什么是URL重写?

浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址

	理解:每一次访问首页时,就帮你创建sessonId,每个超链接的的后面都跟上一个SessionId再发送给你。这时你一点击超链接,会自动带着尾部的sessionId过来。不同的用户在访问首页时在首页的每个超链接后面都跟上你的SessionId.
3、如何完成URL重写?

response. encodeRedirectURL(java.lang.String url)——用于对sendRedirect方法后的url地址进行重写。
response. encodeURL(java.lang.String url)——用于对表单action和超链接的url地址进行重写。

4、应用

1、在servlet中重写url并发送给客户端查看

@WebServlet(urlPatterns={"/session"})
public class SessionServlet extends HttpServlet{

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
		//得到session对象
		HttpSession session=req.getSession();
		 /*
         * 第一次访问服务器,服务器不知道用户有没有禁用cookie,它会把session的id号以cookie的形式
         * 回写,并且也会把url地址重写。第二次访问服务器,若用户没有禁用cookie,就会带cookie过来,
         * 服务器发现你带cookie过来了,就不重写url地址了。
         */
		String url=resp.encodeURL(req.getContextPath()+"/session01");
		out.println("<a href='"+url+"'>重写url:"+url+"</a>");
		out.close();
	}

2、设置浏览器cookie禁用
谷歌浏览器:设置->高级->内容设置->cookie->禁用
在这里插入图片描述

3、访问servlet,查看返回的url
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robona

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值