Session的工作原理及应用——通过session实现加入购物车和支付功能

Session的工作原理

在这里插入图片描述

总结:
(1)session是将会话产生的数据保存在服务端,属于服务端技术
(2)session是一个域对象,session保存了一个map集合,往session存数据本质上就是把数据保存的map集合上
(3)通过session.setAttribute方法将数据保存到session的map集合中,通过session.getAttribute将数据从map集合中取出来

Session作为域对象

Session是一个域对象,因此session中也提供了存取数据的方法。

session.setAttribute(String attrName, Object attrValue);

//往session域中添加一个域属性, 属性名只能是字符串, 属性值可以是任意类型

session.getAttribute(String attrName);

//根据属性名获取session域中的属性值, 返回值是一个Object类型

如何获取session对象:

HttpSession session = request.getSession(); // 获取一个session对象, 如果在服务器内部有当前浏览器对应的session对象,则直接返回该session对象; 如果在服务器内部没有对应session, 则会创建一个新的session对象再返回。

Session域对象的三大特征:

(1)生命周期:

创建session: 在第一次调用request.getSession()方法时, 会创建一个session对象(当客户端在服务器端没有对应的session时, 调用request.getSession方法会让创建一个session对象并返回)

销毁session:

a)超时销毁: 默认情况下, 当超过30分钟没有访问session, session就会超时销毁(30分钟是默认时间,可以修改,但不推荐修改)

b)自杀: 调用session的invalidate方法, 会立即销毁session

c)意外身亡: 当服务器非正常关闭时(断电/硬件损坏/内存溢出等导致服务器意外关闭), session会随着服务器的关闭而销毁;

当服务器正常关闭, 在关闭之前, 服务器会将内部的session对象序列化保存到服务器的work目录下, 变为一个文件, 这个过程叫做session的序列化(也叫做钝化)。再次启动服务器, 钝化着的session会再次回到服务器,变为服务器中的session对象,这个过程叫做session的反序列化(活化)

(2)作用范围:(同一个客户端)在一次会话中,获取到的都是同一个session对象

(3)主要功能:在一次会话范围内实现数据的共享

案例:实现购物车

1.index.html

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>商品列表</title>

</head>

<body>

    <h3>点击下面的商品链接, 可以将商品加入购物车</h3>

    <!--

    http://localhost/13-cookie/index.html

    http://localhost/13-cookie/CartServlet

     -->

    <p><a href="CartServlet?prod=iphone11">iphone11</a></p>

    <p><a href="CartServlet?prod=vivonex3">vivonex3</a></p>

    <p><a href="CartServlet?prod=xiaomishouji">xiaomishouji</a></p>

    <p><a href="CartServlet?prod=huaweip30">huaweip30</a></p>

   

    <h3>点击下面的支付链接, 可以对购物车中的商品进行结算</h3>

    <!-- http://localhost/13-cookie/PayServlet -->

    <a href="PayServlet">支付</a>

   

   

</body>

</html>

2.CartServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

    //处理响应中文乱码

    response.setContentType("text/html;charset=utf-8");

    //获取一个response输出流

    PrintWriter out = response.getWriter();

    //=================================

    //1.获取要加入购物车的商品信息

    String prodName = request.getParameter( "prod" );

    //2.获取一个session对象,将商品信息保存到session中

    HttpSession session = request.getSession();

    session.setAttribute( "cart", prodName );

    //3.做出响应

    out.write( "成功将 [ "+prodName+" ] 加入了购物车~~~" );

}

3.PayServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException {

    //处理响应中文乱码

    response.setContentType("text/html;charset=utf-8");

    //获取一个response输出流

    PrintWriter out = response.getWriter();

    //==================================

    //1.获取一个session对象(之前的session)

    HttpSession session = request.getSession();

    //2.从session中获取到要结算的商品信息

    String prodName = (String)session.getAttribute( "cart" );

    //3.对商品进行结算,做出响应

    out.write( "成功为 [ "+prodName+" ] 支付了2000.0~~~" );

}
在Web开发中,Session是一种在服务器端存储用户数据的方式,可以在多个页面中共享这些数据。Session通常用于存储用户登录信息、购物车信息等。 在Python中,可以使用内置的`session`对象来实现Session功能。下面是一个简单的例子: ```python from flask import Flask, session, redirect, url_for, escape, request app = Flask(__name__) app.secret_key = 'my_secret_key' @app.route('/') def index(): if 'username' in session: username = session['username'] return 'Logged in as ' + username + '<br>' + \ "<b><a href = '/logout'>click here to log out</a></b>" return "You are not logged in <br><a href = '/login'></b>" + \ "click here to log in</b></a>" @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('index')) return ''' <form action="" method="post"> <p><input type="text" name="username"> <p><input type="submit" value="Login"> </form> ''' @app.route('/logout') def logout(): session.pop('username', None) return redirect(url_for('index')) ``` 在上面的例子中,我们使用了Flask框架来实现Web应用。在应用启动时,我们设置了一个`secret_key`,这个密钥用于保护Session数据的安全性。 在`index`函数中,我们检查了Session中是否存在`username`键。如果存在,说明用户已经登录,我们将显示用户的用户名和一个链接,可以用于退出登录。如果不存在,说明用户尚未登录,我们将显示一个登录链接。 在`login`函数中,我们检查了请求的方法是否为POST。如果是,说明用户提交了登录表单,我们将从表单中获取用户名,并将其存储到Session中。然后,我们将重定向到`index`函数中。如果请求的方法为GET,我们将显示一个包含用户名输入框和提交按钮的表单。 在`logout`函数中,我们使用`pop`方法从Session中删除`username`键。然后,我们将重定向到`index`函数中。 总之,Session是一个非常有用的工具,可以帮助我们在Web应用中存储和共享用户数据。使用Python中的`session`对象可以很容易地实现Session功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值