java ee会话_Java EE会话技术Cookie和Session

会话技术

一、定义

9c0823ac26fcd25de43ceff91da5719e.png

会话技术是帮助服务器记住客户端状态的(区分客户端的)。将客户访问的信息存在本地的叫Cookie技术,存在服务器上的叫Session技术。

注意:

一次会话何时开始?从打开一个浏览器访问某个站点时开始

一次会话何时结束?到关闭这个浏览器的时候结束。而不是关掉某个站点时

Cookie和Session的区别

Cookie:数据存储在客户端本地,减少服务器端的存储压力,但是安全性不好,客户端可以清除Cookie

Session:将数据存储到服务器端,安全性相对较好,但是增加了服务器的压力

二、Cookie技术

学习分为两个方面

服务器端怎样将一个cookie发送到客户端

服务器端如何接收客户端携带的cookie

//1创建cookie对象,cookie不能存中文,只能存储非中文字符串

Cookie cookie = new Cookie("name", "zhangsan");

//2以头的形式将cookie中的信息发送到客户端

response.addCookie(cookie);

默认Cookie的级别是会话级别,即关掉浏览器,缓存的东西就被清除。那么如何让cookie持久化呢?

ae4afbdbcc33371f7f7102ad71c3d417.png

如果访问每一个网页都带着cookie,这会增加响应时间。因此我们应该为cookie指定访问哪些资源时需要携带的路径。

8fdbfe161d1e28c693ba104f34b4e5c2.png

注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带该cookie信息。

// 1创建cookie对象,cookie不能存中文,只能存储非中文字符串

Cookie cookie = new Cookie("name", "zhangsan");

// 1.1为cookie对象设置持久化时间

cookie.setMaxAge(1 * 10);// 单位是秒

// 1.2指定需要携带cookie的路径

// 这句话的意思是只在访问/sendCookie时才携带此cookie

// 注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带该cookie信息。

cookie.setPath("/WEWB16/sendCookie");

// 2以头的形式将cookie中的信息发送到客户端

response.addCookie(cookie);

// 获取服务器向客户端写的cookie的数据

Cookie[] cookies = request.getCookies();

// 通过名字获得想要的cookie

if (cookies != null) {

for (Cookie cookie : cookies) {

// 获得cookie的name

String cookieName = cookie.getName();

if ("name".equals(cookieName)) {

// 获得该cookie的值

String cookieValue = cookie.getValue();

System.out.println(cookieValue);

}

}

}

记住用户上一次访问时间

用一个Servlet记住当前访问的时间new Date(),并把当前时间以cookie的形式写给客户端

获取客户端携带名字叫lastAccessTime的这个cookie,并获得时间,显示给用户

代码实现

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// response.setCharacterEncoding("UTF-8");

// 获得当前时间

Date date = new Date();

DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

String currentTime = format.format(date).replace(" ", "9999");

// 1创建一个cookie,记录当前的最新访问时间

Cookie cookie = new Cookie("lastAccessTime", currentTime);

cookie.setMaxAge(60 * 10 * 60);

response.addCookie(cookie);

// 2获得客户端携带的名字为lastAccessTime的cookie

Cookie[] cookies = request.getCookies();

String lastAccessTime = null;

if (cookies != null) {

for (Cookie coo : cookies) {

// 第一次这段代码是不执行的,因此lastAccessTime还是空串

if ("lastAccessTime".equals(coo.getName())) {

lastAccessTime = coo.getValue().replace("9999", " ");

}

}

} // if

response.setContentType("text/html;charset=UTF-8");

if (lastAccessTime == null) {

response.getWriter().write("你是第一次访问");

} else {

response.getWriter().write("你上次访问的时间是:" + lastAccessTime);

}

}

tomcat版本过高会出现错误

An invalid character [32] was present in the Cookie value

这个错误是由于格式化的时间字符串中有空格,而cookie的值中不能有空格([32]),解决办法是

解决问题的方法其实很简单,只要字符串中不存在空格即可成功。

思路:用其他cookie允许的字符代替空格“ ”,之后记得换回来即可,程序成功运行。

三、Session技术

59b9487fd566661d1aa5d9f4541a29c7.png

session技术是基于cookie技术的

学习内容包括两块内容

怎样创建一个专属一个客户端的session区域

怎样向session区域中存取数据

发送编号JSESSIONID(用于存储session编号的)和根据编号去寻找session区域位置,这些操作是客户端和服务器自动完成,不要手动编码。

1、获得session对象

// 创建属于该客户端(会话)的私有session区域

HttpSession session = request.getSession();

//获得该session对象的编号id

String sessionId = session.getId();

response.getWriter().write("JSESSIONID=" + sessionId);

request.getSession()方法内部会判断,该客户端是否在服务器端已经存在session

如果不存在,那么就会创建一个新的session对象

如果该客户端在此服务器上已经存在,则会获得已经存在的该session对象返回(其实质就是根据JSESSIONID判断客户端是否在服务器上已经存在session了)

2、怎样向session中存取数据(session也是一个域对象)

session也是一个存储数据的区域对象,所以也具有以下方法:

setAttribute(String name, Object o)

getAttribute(String name)

removeAttribute(String name)

3、session对象的生命周期(面试题或笔试题)

何时创建:第一次执行方法HttpSesion request.getSession()的时候创建

何时销毁:

服务器非正常关闭时

session失效(过期)(默认时间30分钟,可以在工程的web.xml中进行配置)

问题:30分钟时间的起算点是什么?即从何时开始计算30分钟?

答:从不操作服务器端的资源开始计时。例如:打开一个网站,不进行任何操作,开始计时,到29分钟的时候,再访问一次,这时session开始重新计时

30

手动销毁

session.invalidate()

4、session对象的作用范围

默认在一次会话中,也就是说,一次会话中任何资源共用一个session对象

面试题:

浏览器关闭,session就销毁了。这种说法对吗?

session是存在服务器端,客户端关闭不影响。服务器有自己的销毁方式

5、JSESSIONID的持久化

由于存储JSESSIONID编号的cookie默认是会话级别的,一关闭浏览器就会失效,所以需要为它持久化。

HttpSession session = request.getSession();

session.setAttribute("name", "Tom");

//获得该session对象的编号id

String sessionId = session.getId();

//手动创建一个存储JSESSIONID的cookie,并设置时间,完成JSESSIONID的持久化

Cookie cookie = new Cookie("JSESSIONID", sessionId);

cookie.setPath("/WEB16/");

cookie.setMaxAge(10*60);//10分钟

response.addCookie(cookie);

验证码校验示例代码

// 验证用户密码之间先进行验证码校验

// 获得用户在页面输入的验证码

String checkCode_client = request.getParameter("checkCode");

// 获得生成图片的文字的验证码

String checkCode_session = (String) request.getSession().getAttribute("checkCode");

// 对比用户输入的和生成的验证码是否一致

if (!checkCode_client.equals(checkCode_session)) {

request.setAttribute("loginErrorInfo", "您的验证码不正确");

request.getRequestDispatcher("/login.jsp").forward(request, response);

return;

}

总结

会话技术

Cookie技术:存到客户端

发送cookie

Cookie cookie = new Cookie(name, value);

cookie.setMaxAge(秒);

cookie.setPath();

response.add(cookie);

获得cookie

Cookie[] cookies = request.getCookies();

cookie.getName();

cookie.getValue();

Session技术:存到服务器端,借助cookie存储JSESSIONID,涉及它的持久化(借助cookie);session是一个域对象

HttpSession session = request.getSession();

session.setAttribute(name, value);

getAttribute(name);

Session的生命周期

创建:第一次指定request.getSession()

销毁:三种方式,服务器关闭、session失效/过期、手动关闭session.invalidate()

session作用范围:默认一次会话中(借助cookie将JSESSIONID持久化)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值