Java Web Session会话技术,以及一些问题

Java Web 会话技术Session

2020/8/25

session

1.简述和快速入门
视频笔记
在这里插入图片描述
快速入门

1.获取session对象(使用request的getSession的方法)
2.使用sessio(session是会话作用域和请求作用域一样去使用,getAttribute和setAttribute方法来设置键值对)

代码如下
SessionDemo1

package cn.zsc.session;

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


/***
 * Session快速入门
 * 步骤
 * 1.先获取session对象,使用request的getSession的方法
 * 2.使用session来设置要存储的数据,使用setAttribute的方法
 * 3.使用session来获取存储的数据,使用getAttribute的方法
 */

@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //解决中文乱码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //1.获取session对象
        HttpSession session = request.getSession();
        //2.存储数据
        session.setAttribute("name","张上");
        session.setAttribute("age","18");
        session.setAttribute("hobby","singing");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

SessionDemo1_1

package cn.zsc.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/SessionDemo1_1")
public class SessionDemo1_1 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //解决中文乱码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //使用session来获取存储的数据
        //1.获取session对象
        HttpSession session = request.getSession();
        //2.根据储存数据的名字来获取值
        Enumeration<String> attributeNames = session.getAttributeNames();
        while (attributeNames.hasMoreElements()){
    
    
            String s = attributeNames.nextElement();
            Object name = session.getAttribute(s);
            response.getWriter().println(s+":"+name+"<br>");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

2.细节和特点
视频笔记
在这里插入图片描述
1.第一个问题:当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
代码如下

package cn.zsc.session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/***
 * 当客户端关闭后,服务器不关闭,还是可以继续获取到同一个session
 * 解决方法:如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。并且发送cookie
 */
@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //解决中文乱码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //1.获取session
        HttpSession session = request.getSession();
        //2.创建cookie
        Cookie ck=new Cookie("JSESSIONID",session.getId());
        ck.setMaxAge(60*60);          //cookie持久化一天
        //3.发送cookie(千万不要忘记发送cookie)
        response.addCookie(ck);
        //4.打印session对象
        System.out.println(session);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

2.第二个问题:客户端不关闭,服务器关闭后,两次获取的session是同一个吗?

客户端不关闭,服务器关闭后,两次获取的session不是同一个,但是要确保数据不丢失
解决方法:
session的钝化:
在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。

在tomcat中已经帮我们解决session的钝化与活化,而且必须使用本地的tomcat才行,
idea并不可以实现这样的功能,他只能实现钝化,不能实现活化

代码如下

package cn.zsc.session;

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

/***
 *客户端不关闭,服务器关闭后,两次获取的session不是同一个,但是要确保数据不丢失
 * 解决方法:
 *              session的钝化:
 * 					在服务器正常关闭之前,将session对象系列化到硬盘上
 * 				 session的活化:
 * 					在服务器启动后,将session文件转化为内存中的session对象即可。
 * 	        *在tomcat中已经帮我们解决session的钝化与活化,而且必须使用本地的tomcat才行,
 * 	        idea并不可以实现这样的功能,他只能实现钝化,不能实现活化
 */
@WebServlet("/SessionDemo3")
public class SessionDemo3 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //解决中文乱码
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //1.获取session对象
        HttpSession session = request.getSession();
        System.out.println(session);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doPost(request, response);
    }
}

第三个问题:session什么时候被销毁?
解答:

扫描二维码关注公众号,回复: 14933273 查看本文章
  1. 服务器关闭
    2. session对象调用invalidate() 。
    3. session默认失效时间 30分钟
    选择性配置修改
<session-config>
	<session-timeout>30</session-timeout>
</session-config>

特点

  1. session用于存储一次会话的多次请求的数据,存在服务器端
    2. session可以存储任意类型,任意大小的数据

3.session和cookie的区别
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全

在响应重定向中一般使用session来共享数据,请求转发中可以直接使用request的请求作用域来共享数据

猜你喜欢

转载自blog.csdn.net/Jackbillzsc/article/details/108230141
今日推荐