Session

一.Session的原理:
1.利用Cookie在客户端浏览器中保存了Session的ID
ID 不是敏感信息, 是随机生成的
2.在用户第一次访问网站时候生成Session ID
3.服务器端为每个Session ID分配了一个缓存集合(Map)
4.每个用户的Session ID 不重复, 每个用户都有属于自己的一个Session缓存(集合)
5.这个Session集合是保存到服务器端的, 可以存储任何敏感信息, 客户端不可见!
6.Session可以通过request对象得到, 其类型为 HttpSession
7.在JSP中session是内置对象 或者 从PageContext中获得.
8.为了避免服务器内存过度消耗, 如果 Session 对象从最后一次访问开始计时超过20分钟没有使用, 则销毁.
session对象的超时销毁时间可以在web.xml中设置.

二.关键要点:
每个用户(浏览器)对应唯一的一个Session对象
Session对象保存在服务器
Session的ID利用Cookie保存在客户端
Session对象超时销毁.

三.比较Cookie与Session
1.Cookie的数据存在客户浏览器端,明码保存
(1)Cookie没有数据安全性,不适合保存敏感数据
(2)一般用于保存文本的ID数据
2.Cookie只能保存文本数据
(1)数据量不能太大,一般不超过4k
(2)其编码是ISO8859-1,存储中文和特殊字符需要编码
3.Session保存在服务器端
(1)客户不能直接看到,Session可以安全保存数据
(2)Session不能持久保存数据,会超时删除的!持久数据应该放在数据库中.
(3)Session中可以存储大量数据,服务器会利用硬盘进行缓存数据
缓存时候是利用对象序列化技术实现!但是会变慢.
4.Session是ID是利用Cookie存储在客户端的!
(1)如果客户端不能存储Session ID,Session 失效
(2)或者删除Session ID 则Session失效

四.JSTL EL 与 Session
在JSP中可以利用 JSTL EL 访问 Session 中的数据
EL 表达式的查找过程:
1.EL 表达式在默认情况下 按照先后次序在 pageContext,request,
session和application空间中查找变量,先找到为准!
(1)返回数据时候调用其方法 xxx.getAttribute(name)
2.如果需要在特定的范围内查找数据请使用内置对象:pageScope,requestScope,
sessionScope,applicationScope

五.浏览器禁用Cookie,则实现URL重写来发送SessionId
浏览器在访问服务器的某个地址时,会使用一个改写过的地址,
即在原有地址后追加SessionID,这种重新定义URL内容的方式叫做URL重写。
1.生成链接地址和表单提交时,实现URL重写
如:<a href=”<%=response.encodeURL(String url)>”>链接地址</a>
2.如果是重定向,使用如下代码代替response.sendRedirect()
response.encodeRedirectURL(String url);


演示Session的创建:

package cn.tedu.tstore.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 演示Session的创建
 */
public class SessionDemoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//第一次获取Session时候,会自动创建Session
		HttpSession session = request.getSession();
		
		//Session ID 会自动通过Cookie下发到
		//浏览器的Cookie中
		String id = session.getId();
		System.out.println(id);
		double d = Math.random();
		//将随机数保存到当前用户的Session中
		session.setAttribute("test", d);
		System.out.println("test:"+d); 
		
		//简单响应
		response.setContentType("text/html");
		response.getWriter().print("OK");
	}

}

读取Session中的数据:

package cn.tedu.tstore.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 读取Session中的数据
 */
public class ReadSessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取当前用户的Session对象
		//getSession()如果没有Session则创建
		//Session如果有Session对象,则获取当前Session对象
		HttpSession session = request.getSession();
		Double d =(Double)session.getAttribute("test");
		System.out.println("id:"+session.getId());
		System.out.println("test:"+d);
		//简单响应
		response.setContentType("text/html");
		response.getWriter().println(d);
	}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

linsa_pursuer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值