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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34598667/article/details/83016178

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

本章接上一章 https://blog.csdn.net/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
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_34598667/article/details/83016178