会话之Cookie和Session的使用

本文深入讲解Web开发中的会话管理技术,包括Cookie和Session的工作原理、应用场景及其实现方式,并提供具体的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


**会话:**在Web中,会话表示从浏览器打开某个网站和服务器进行交互,无论进行哪些操作,直到关闭浏览器,这个过程,称之为一次会话
如何算会话结束:

  • 客户端关闭
  • 服务器销毁
    会话所涉及的两个端(客户端和服务端),JavaWeb中针对这两个不同的端,诞生了两个机制
    客户端来看,诞生了Cookie,在本地浏览器留下了标识符,会话从浏览器中提交信息
    服务器端来看,诞生了Session,再服务器端留下了标识符,会话从服务器中提交信息
Cookie

构造器:

Cookie cookie =new Cookie(String name ,String value);

服务器响应cookie给客户端

Response.addCookie(cookie);

服务查看用户带来的请求中是否含有cookie

//可以使用cookie来判断用户是否来过
Cookie[] cookie=Request.getCookie();
//判断cookie是否为空,然后遍历
For(int i=0;i<cookie.length;i++){
	Cookie cookie=cookie[i];
	cookie.getName();
	cookie.getValue();
}
cookie示例:

需求:通过cookie判断用户是否来过,若没有来过,就让他办张卡0_0,若来过,显示上次来的时间

public class CookieTest extends HttpServlet {
	//设置全局标识符
    boolean flag = false;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决乱码问题:
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        //检查请求的人是否带了Cookie
        //通过用户的请求,检查它是否有cookie
        Cookie[] cookies = request.getCookies();
        System.out.println("cookie:"+cookies);
        if (flag){//如果flag是真,来过
            if (cookies!=null){//你有cookie
                for (int i = 0; i < cookies.length ; i++) {
                    Cookie cookie = cookies[i];
                    if (cookie.getName().equals("lastLoginTime")){
                        response.getWriter().println("你上一次来的时间为:"+cookie.getValue());
                        System.out.println("刷新了cookie");
                    }
                }
            }
        }else { //如果flag是真,没来过
            response.getWriter().println("你是第一次来,还想要会员套餐");
            System.out.println("给该用户一个cookie");
        }

        //建立一个cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
        //设置cookie保存的时间 //cookie.setMaxAge();
        //把这个cookie发给客户端
        response.addCookie(cookie);
        //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
        flag = true;
    }
}

(别忘记配置web.xml…)
第一次访问的时候,自上而下,还没有创建cookie,因此,此时标识符判断会进入else{}里,接着代码执行,创建cookie,在我们刷新页面后,因为cookie已经在上次创建了,因此这次就会变成了第二次访问,会随之打印上次来的时间
有一个点:在给cookie添加value属性的上次时间时,value应为String类型,我们可以使用System.currentTimeMillis+""拼接的形式,将时间和空字符串拼接来实现

Session

只要客户端一旦连接上服务器,服务器就会自动产生Session;

一个连接对应一个session,session可以在一个会话中传递信息;

        //得到sessionID,一次会话,一个seesionID;
        HttpSession session =req.getSession();
        String id = session.getId();
        //输出在网页中
        resp.getWriter().println("获得的sessionId:\n"+id);

通过setAttribute设置值。

通过getAttribute获得值。

由服务器端控制,服务器如果重启了,信息就会丢失!

Session示例

需求:使用session在两个servlet之间进行传递数据

servlet01:(将数据写入session中,并输出Sessionid)
public class SessionTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题:
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        //Session由服务器自动创建,如何获得session
        //HttpSession 得到的sessioin对象
        HttpSession session = req.getSession();
        //得到sessionID,一次会话,一个seesionID;
        String id = session.getId();
        resp.getWriter().println("获得的sessionId:\n"+id);
        String name = "暮凌寒雪";
        //向session中存入一个值;
        session.setAttribute("name",name);
        resp.getWriter().println("存入信息成功:"+name);
    }
}
servlet02:将session中的值读取出来,并输出sessionid
//获得session存入的值
public class SessionTest2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题:
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //获得
        HttpSession session = req.getSession();
        System.out.println("得到的SessionID:"+session.getId());

        String name = (String) session.getAttribute("name");
        resp.getWriter().println("得到的session存入的信息"+name);
    }
}

(别忘了配置web.xml)
session相对于cookie而言,要简单一些,可以通过get/setAttribute来传入或者读取数据

会话注销方法:
  1. 可以通过代码注销会话:
session.invalidate();//了解即可,不推荐使用
  1. 在web.xml中设置会话自动过期,时间是以分钟为单位,
	<session-config>
		<session-timeout>1</session-timeout>
	</session-config>

一分钟过期…

会话技术是Web开发中用于跟踪用户状态的重要手段,其中cookiesession是两种常见的会话技术。它们的主要区别在于数据的存储位置处理方式。 ### Cookie Cookie是一种由服务器发送给客户端(通常是浏览器)的数据片段,客户端会将这些数据存储在本地,并在后续的请求中将其发送回服务器。 1. **存储位置**:客户端(浏览器)。 2. **生命周期**:可以设置过期时间,如果没有设置,则在浏览器关闭时失效。 3. **安全性**:数据存储在客户端,存在被篡改的风险。可以设置HttpOnlySecure属性来增强安全性。 4. **容量限制**:每个域名下的cookie数量大小有限制(通常不超过4KB)。 ### Session Session是一种服务器端的技术,用于在服务器上存储用户的状态信息。服务器会为每个用户创建一个唯一的会话ID,并通过cookie或URL重写将该ID发送给客户端。 1. **存储位置**:服务器端。 2. **生命周期**:默认情况下,session在浏览器关闭时失效,但可以通过设置超时时间来延长。 3. **安全性**:数据存储在服务器端,相对更安全。 4. **容量限制**:服务器端的存储容量通常较大,但受限于服务器配置。 ### 应用场景 - **Cookie**:用于存储一些不敏感的信息,如用户的偏好设置、登录状态等。 - **Session**:用于存储敏感信息,如用户的登录凭证、购物车内容等。 ### 示例 ```javascript // 设置cookie document.cookie = "username=John Doe; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/"; // 获取cookie function getCookie(name) { let value = "; " + document.cookie; let parts = value.split("; " + name + "="); if (parts.length === 2) return parts.pop().split(";").shift(); } // 使用session // 假设使用Node.jsExpress框架 const express = require('express'); const session = require('express-session'); const app = express(); app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true })); app.get('/login', (req, res) => { req.session.user = { name: 'John Doe' }; res.send('Logged in'); }); app.get('/dashboard', (req, res) => { if (req.session.user) { res.send('Welcome, ' + req.session.user.name); } else { res.send('Please login'); } }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值