JavaWeb—cookie与Session

会话技术

什么是会话:用户开一个浏览器,点击多个超链接,访问服务器多个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的生命周期
  1. 创建
    第一次执行request.getSession()时创建
  2. 销毁
    服务器关闭时
    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);
发布了25 篇原创文章 · 获赞 0 · 访问量 276

猜你喜欢

转载自blog.csdn.net/qq_42219004/article/details/105326077
今日推荐