zl程序教程

您现在的位置是:首页 >  其他

当前栏目

JavaWeb——Session技术

技术 session javaweb
2023-09-14 09:14:08 时间

1.引入

Cookie的不足:

  1. 不能保存对象

  2. 不能保存中文

  3. 大小才4k

  4. 数据明码保存在客户端,不安全

         另外的解决方案就是使用session。

         Session是将会话数据保存在服务端的技术

2.Session技术核心

   Session的创建:

        session的创建是由服务器创建,我们只能向服务器要session对象:               HttpSession req.getSession()/getSession(Boolean b):返回一个Session对象

  Session的设置:

        1.void setMaxInactiveInterval(int num):设置Session的存活时间

        2.void invalidate():销毁Session对象

        3.String getId():返回Session对象的id

  Session作为域对象的api:

        1.void setAttribute(String key,Object value):添加一个键值对

        2.Object getAttribute(String key):根据键获取值

        3.Void removettribute(Strinf key):根据键删除键值对

3.session的原理

    1.session是如何区分出不同的浏览器?
    浏览器1——》第一次访问网站——》服务器检测这个浏览器是不是第一次访问——》服务器会创建一个session对象,与这个浏览器绑定
    浏览器1——》第n次访问网站——》服务器发现是第n次访问——》服务器资源需要session的时候会直接使用与浏览器绑定的session对象
    浏览器2——》第一次访问网站——》服务器会创建一个新的session对象与浏览器绑定
    ......
    2.session与浏览器是如何绑定的?
    浏览器第一次访问的时候,服务器检查cookie中有没有一个名字叫做JSESSIONID的,如果有,说明是第n次访问,没有就是第一次访问
        a.第一次访问:
            服务器会创建一个session对象,将session对象的id使用cookie(JSESSIONID,id)发送给浏览器
        b.第二次访问:
            读取sessionId,根据id获取服务端保存的session对象
    3.session在服务端如何保存的?
    session在服务端的保存,类似于map结构
        <String,HttpSession>
        <"s001",session1>
        <"s002",session2>
        ......

4.session细节

     HttpSession req.getSession() 和 getSession(Boolean b)区别:
        1.getSession()效果:
            a.如果当前的请求还没有对应的session对象,就创建一个新的session对象
            b.如果已经有绑定的session对象,就返回原有绑定的对象
        2.getSession(true) 等效 getSession()
        3.getSession(false)
            a.如果当前线程有session对象,就返回已经存在的session对象
            b.如果当前线程没有session对象,服务器就返回null
        我们在开发中使用哪个:默认使用使用无参的,getSession(false)也有使用场景
    session的存活时间:
        1.浏览器关闭,session失效
            能不能实现:浏览器关闭,不影响session的失效,需要手动写cookie
        2.如果浏览器不关闭,session也会失效的
            WEB-INF->web.xml添加如下代码:session一分钟后失效
            <session-config>
                <session-timeout>1</session-timeout>
            </session-config>

 1.写入

@WebServlet(name = "session1", urlPatterns = "/session1")
public class Session1Servlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.session对象的获取
        HttpSession session = req.getSession();
        System.out.println(session.getId());
        //2.使用session保存数据
        session.setAttribute("user", "admin");
        //3.如果需要实现浏览器关闭,session不失效,需要手写cookie
        Cookie cookie = new Cookie("JSESSIONID", session.getId());
        //3.1设置Cookie的超时时间
        cookie.setMaxAge(60 * 60);
        //3.2写Cookie
        resp.addCookie(cookie);
        System.out.println("cookie设置完毕");
    }
}

 2.读取

@WebServlet(name = "session2", urlPatterns = "/session2")
public class Session2Servlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.session对象的获取
        HttpSession session = req.getSession(false);
        System.out.println(session.getId());
        //2.获取session保存的数据
        String user = (String) session.getAttribute("user");
        System.out.println("user = " + user);
    }
}

 3.销毁

@WebServlet(name = "session3", urlPatterns = "/session3")
public class Session3Servlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.session对象的获取
        HttpSession session = req.getSession(true);
        System.out.println(session.getId());
        //2.销毁session对象
        session.invalidate();
        System.out.println("销毁成功");
    }
}