JavaWeb Session

1. 会话(Session)

会话(Session)是指在网络通信中,为了实现持久化连接而建立的一种交互方式。会话可以在客户端和服务器之间建立,并且在一段时间内保持活动状态,以便在多个请求和响应之间共享信息。

在JavaWeb开发中,Session是一种用于跟踪用户状态和在多个请求之间共享数据的机制。它是基于HTTP协议的会话管理技术。

在用户与Web应用程序进行交互时,服务器会为每个用户创建一个Session对象,并为其分配一个唯一的会话标识符(Session ID)。这个会话标识符通常以cookie的形式发送给客户端,或者可以通过URL重写的方式在URL中传递。客户端在后续的请求中会将会话标识符发送回服务器,以便服务器能够识别和关联该用户的会话

会话可以用于存储和共享用户的相关信息,例如用户的身份验证状态、购物车内容、用户首选项等。服务器可以将这些信息存储在会话对象中,以便在用户的不同请求之间进行访问和更新。

会话的优点包括:

  • 持久化连接:会话可以在多个请求之间保持连接,避免了每次请求都需要重新建立连接的开销。直到关闭了浏览器,也就关闭了这个会话。
  • 跨请求共享数据:会话可以存储和共享用户的相关信息,使得在不同请求之间可以方便地访问和更新这些信息。
  • 用户状态跟踪:会话可以用于跟踪用户的登录状态和其他状态信息,以便在用户的整个访问过程中保持一致性。
  • 安全性:通过使用会话标识符和其他安全机制,可以确保会话的安全性,防止会话劫持和伪造。

2.使用Session对象

HttpSession类的方法:

 

在Java中,可以通过HttpServletRequest对象的getSession方法来获取Session对象。示例如下:
在Session中设置属性

package com.study.cookie;

import javax.servlet.ServletException;
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.io.PrintWriter;

public class SessionCookie extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.setAttribute("time", System.currentTimeMillis());

        PrintWriter writer = resp.getWriter();
        if(session.isNew()){
            writer.print("This is a new session with ID " + session.getId());
        }else{
            writer.print("The site has have a session with ID " + session.getId());
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

在另一个Servlet中读取属性:

package com.study.cookie;

import javax.servlet.ServletException;
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.io.PrintWriter;
import java.util.Date;

public class Session2Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();

        PrintWriter writer = resp.getWriter();
        Long value = (Long) session.getAttribute("time");
        Date date = new Date(value);
        writer.print("last time is " + date);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

这说明一个用户在访问一个网站时,一直用的是同一个Session,可以通过这个Session共享数据。

3.关闭Session

方法一:直接关闭浏览器,Session自动结束了。

方法二:Servlet中调用销毁会话的方法:

session.invalidate();

方法三:在web.xml中设置有效时间,单位为分钟

<session-config>
  <session-timeout>1</session-timeout>
</session-config>

4.Session和Cookie的区别

Session和Cookie是在Web开发中用于跟踪用户状态和在多个请求之间共享数据的机制,但它们有一些关键的区别。

存储位置:Cookie是存储在客户端(浏览器)中的小型文本文件,而Session是存储在服务器端的对象。Cookie通过在HTTP请求头中传递,将数据存储在客户端的Cookie文件中。而Session则将数据存储在服务器端的内存或持久化存储中。

数据安全性:由于Cookie是存储在客户端,因此它们容易受到安全攻击,如跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。为了增加安全性,Cookie可以设置HttpOnly和Secure属性,但仍然存在风险。相比之下,Session数据存储在服务器端,对客户端不可见,因此更安全。

容量限制:Cookie的大小通常受到浏览器对Cookie的限制,一般为4KB左右。而Session的容量限制通常由服务器端的配置和可用内存决定,可以存储更大量的数据

跨域支持:Cookie可以在不同域名之间共享,通过设置Cookie的域属性来实现。而Session默认情况下只在同一个域名下共享。

性能开销:由于Session是存储在服务器端,因此在高并发环境下,大量的Session对象可能会占用服务器的内存资源。而Cookie是存储在客户端,对服务器的负载影响较小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值