会话技术
什么是会话:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。和打电话一样,电话接收,开始会话,电话 挂断,结束会话。
会话技术解决什么问题:保持各个客户端自己的数据,每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
cookie
将用户的信息保存在浏览器当中
- 创建Cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);
cookie会以响应头的形式发送给客户端,Cookie只能存储非中文的字符串。
- 向客户端发送cookie
response.addCookie(cookie名称)
- Cookie默认存储时间
默认cookie的会话级别,打开浏览器,关闭浏览器为一次会话,如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁。 - 设置Cookie在客户端的存储时间
cookie.setMaxAge(int seconds);
设置的时间为秒,如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里,过期会自动删除。
- 设置Cookie的携带路径
如果创建的某个Cookie对象没有设置Path属性,那么该Cookie只对当前访问路径及其子目录有效。
cookie.setPath(String path);
//对整个站点有效
cookie.setPath("/");
- 删除Cookie
如果想删除客户端的已经存储的cookie信息,使用同名同路径的持久化时间为0的cookie进行覆盖即可。 - 服务器如何获取客户端携带的cookie
通过Request对象的getCookies()方法,获取的是所有的cookie,要进行遍历,找出自己名称的那一个。
package org.youyuan.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Servlet8")
public class Servlet8 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("name","youyuan");
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
for (Cookie cookie1 : cookies) {
String name = cookie1.getName();
String value = cookie1.getValue();
System.out.println(name+"---->"+value);
}
}
}
显示用户上次访问的时间
@WebServlet("/Servlet9")
public class Servlet9 extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Date date = new Date();
String time = null;
/*这里的时间dd与hh之间一定不能用空格
* 由于tomcat的版本比较高,所以在addCookie时是不能使用空格的 而在ASCII码中32对应的就是空格
* 加一个-*/
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd-hh:mm:ss");
String format = simpleDateFormat.format(date);
Cookie cookie = new Cookie("lastTime",format);
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie1 : cookies) {
if (cookie1.getName().equals("lastTime")) {
time = cookie1.getValue();
}
}
}
if (time != null){
response.getWriter().write("当前时间为:"+time);
}else {
response.getWriter().write("您是首次登录");
}
}
}
session
-
session简介:Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间,Session需要借助于Cookie存储客户的唯一性标识SESSIONID。
-
Session如何办到在一个servlet当中存数据,在别的servlet当中取出当初存储的数据?
每一个用户访问服务器时,会给该用户分配他自己对应的存储空间,并且创建的存储空间有一个编号我们称为SessionID,第一次访问时, 会把对应的sessionID以Cookie的形式写给浏览器,下次再访问时, 会携带sessionID,找到当初创建的那个存储空间,在对应的存储空间当中取出数据。 -
学习如何获取Session对象
HttpSession session = request.getSession();
获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象,会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回,本质就是根据SESSIONID判断该客户端是否在服务器上已经存在session了。
- 怎么样向session当中存取数据
Session对象也是一个域对象
HttpSession session = request.getSession();
session.setAttribute("name","youyuan");
String name = (String) session.getAttribute("name");
System.out.println(name);
session.removeAttribute("name");
- session的生命周期
- 创建
第一次执行request.getSession()时创建 - 销毁
服务器关闭时
session过期/失效(默认30分钟),是从最后一次操作结束时计时。
手动销毁
session.invalidate();
- 作用范围
默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象
JsessioID持久化
默认情况下,第一次获取session对象时, 会帮你创建一个session,可以获取该Session的ID,会自动的把id写到cookie当中。
存在的问题:
第一次访问sevlet1时存储一些数据,在第二个servlet当中直接取数据,可以直接取到。
把浏览器关闭,直接到第二个servlet当中取数据,发现取不到数据了。
原因:
因为访问的时候要求带着jsessionID,由于默认情况下,存储cookie是会话级别的,关闭浏览器,就没有了。所以再次打开浏览器。访问资源时,没有jsessionID. 就会创建一个新的session. 就取不到数据了。
解决办法:
在写数据时,自己手动去把sessionID写到cookie当中,写的时候,设置持久化时间,注意,key值一定是和它自动生成的key值是一样的。
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(30*60);
cookie.setPath("/");
response.addCookie(cookie);