Java Servlet学习笔记——6.HttpSession

本文介绍了Java Servlet中的HttpSession对象,包括如何通过getSession()获取和创建,使用setAttribute()和getAttribute()存储和获取对象,HttpSession的过期设置以及相关方法。还通过一个小型在线商城的实例展示了HttpSession在购物车功能中的应用。
摘要由CSDN通过智能技术生成

写在前面

这部分学习HttpSession,这个我之前也有用过,但还是没有成体系特别了解,所以这里借机会整理一下书中所学。

声明:主要内容来源《Servlet、JSP和Spring MVC初学指南》,我只是整理一下知识内容方便自己查看,顺便做一下分享。

在所有的会话跟踪技术中, HttpSession 对象是最强大和最通用的。 一个用户可以有且最多有一个HttpSession, 并且不会被其他用户访问到。

getSession()

HttpSession对象在用户第一次访问网站的时候自动被创建, 你可以通过调用HttpServletRequest的getSession方法获取该对象。 getSession有两个重载方法:

HttpSession getSession()
HttpSession getSession(boolean create)
  • 没有参数的getSession方法会返回当前的HttpSession, 若当前没有, 则创建一个返回。
  • getSession(false)返回当前HttpSession, 如当前存在, 则返回null
  • getSession(true)返回当前HttpSession, 若当前没有, 则创建一个getSession(true)同getSession()一致。

setAttribute()与getAttribute()

可以通过HttpSession的setAttribute方法将值放入HttpSession, 该方法签字如下:

void setAttribute(java.lang.String name, java.lang.Object value)

请注意, 不同于URL重新、 隐藏域或cookie, 放入到HttpSession 的值, 是存储在内存中的, 因此, 不要往HttpSession放入太多对象或大对象。 尽管现代的Servlet容器在内存不够用的时候会将保存在HttpSessions的对象转储到二级存储上, 但这样有性能问题, 因此小心存储。

注意放到HttpSession的值不限于String类型, 可以是任意实现java.io.Serializable的java对象, 因为Servlet容器认为必要时会将这些对象放入文件或数据库中, 尤其在内存不够用的时候, 当然你也可以将不支持序列化的对象放入HttpSession, 只是这样, 当Servlet容器视图序列化的时候会失败并报错。

调用setAttribute方法时, 若传入的name参数此前已经使用过, 则会用新值覆盖旧值。

通过调用HttpSession的getAttribute方法可以取回之前放入的对象, 该方法的签名如下:

java.lang.Object getAttribute(java.lang.String name)

HttpSession 还有一个非常有用的方法, 名为getAttributeNames, 该方法会返回一个Enumeration 对象来迭代访问保存在HttpSession中的所有值:

java.util.Enumeration<java.lang.String> getAttributeNames()

注意, 所有保存在HttpSession的数据不会被发送到客户端, 不同于其他会话管理技术, Servlet容器为每个HttpSession 生成唯一的标识, 并将该标识发送给浏览器, 或创建一个名为JSESSIONID的cookie, 或者在URL后附加一个名为jsessionid 的参数。 在后续的请求中, 浏览器会将标识提交给服务端, 这样服务器就可以识别该请求是由哪个用户发起的。 Servlet容器会自动选择一种方式传递会话标识, 无须开发人员介入。

可以通过调用 HttpSession的getId方法来读取该标识:

java.lang.String getId()

HttpSession的过期设置

HttpSession.还定义了一个名为invalidate 的方法。 该方法强制会话过期, 并清空其保存的对象。 默认情况下, HttpSession 会在用户不活动一段时间后自动过期, 该时间可以通过部署描述符的 session-timeout元素配置, 若设置为30, 则会话对象会在用户最后一次访问30分钟后过期, 如果部署描述符没有配置, 则该值取决于Servlet容器的设定。

大部分情况下, 你应该主动销毁无用的HttpSession, 以便释放相应的内存。

HttpSession 的getMaxInactiveInterval方法可以查看会话多久会过期。 该方法返回一个数字类型, 单位为秒。 调用setMaxInactiveInterval 方法来单独对某个HttpSession 设定其超时时间:

void setMaxInactiveInterval(int seconds)

若设置为0, 则该HttpSession 永不过期。 通常这不是一个好的设计, 因此该 HttpSession 所占用的堆内存将永不释放, 直到应用重加载或Servlet容器关闭。

实例代码

构造一个小的有4个商品的在线商城, 用户可以将商品添加到购物车中, 并可以查看购物车内容。

  • Product类:作为商品的对象,储存商品的Id、名称、描述与价格信息。
  • ShoppingItem类:作为购物车的对象,储存Product类(商品)与数量信息。
  • ShoppingCattServlet类:在线商城的Servlet类,用来响应各种操作,向浏览器发送页面。

Product类

package app02a.Product;

public class Product {
    private int id;
    private String name;
    private String description;
    private float price;

    public Product(int id, String name, String description, float price){
        this.id = id;
        this.name = name;
        this.description = description;
        this.price =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值