【Java.Web】Session —— HttpSession及相关

本文详细介绍了HTTP Session的概念及其在Web应用程序中的作用。包括Session的生命周期、如何通过Servlet容器管理和使用HttpSession对象,以及Session数据的存储方式等内容。

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

HttpSession及相关

Session范围是指浏览器与一个Web应用程序进行一次Seesion的过程。在具体的实现上,Session范围与HttpSession对象的生命周期对应。因此,Web组件只要共享同一个HttpSession对象,也就能共享Session范围内的共享数据。


  • HttpSession接口的方法如下,Web应用中的JSP或Servlet组件可通过这些方法来访问Session:

方法描述
getId()返回Session ID
invalidate()销毁当前Session,Servlet容器会释放HttpSession对象占用的资源
setAttribute(String name, Object value)将一对name/value属性保存在HttpSession对象中
getAttribute(String name)根据name参数返回保存在HttpSession对象中的属性值
removeAttribute(String name)从HttpSession对象中删除name参数的指定属性
getAttrubuteNames()以数组的方式返回HttpSession对象中的所有的属性名
isNew()判断是否是新创建的Session,如果是新建的会话,返回true
setMaxInactiveInterval(int interval)设定一个会话可以处于不活动状态的最长时间,以秒为单位。如果超过这个时间,Servlet容器会自动销毁会话。如果把参数internal设置为负数,表示不限制会话处于不活动状态的时间,即会话永远不会过期。

Session的超时时间可以在web.xml中设置
getMaxInactiveInterval()读取当前会话可以处于不活动状态的时间
getServletContext() 返回会话所属的Web应用的ServletContext对象
  

  • 在以下情况下,会开始一个新的会话,即Servlet容器会创建一个新的HttpSession对象:
    • 一个浏览器进程第一次访问Web应用中的支持Session的任意一个网页
    • 当浏览器进程与Web应用的一次会话已经被销毁后,浏览器进程再次访问Web应用中的支持会话的任意一个网页
    • 当浏览器进程与Web应用的一次会话被销毁后,服务器端的相应HttpSession对象结束生命周期。当浏览器进程再次访问Web应用中的支持Session的任意一个网页时,在它的HTTP请求的Cookie中包含已经被销毁的Session的Session ID,Servlet容器无法找到该Session ID对应的HttpSession对象,在这种情况下,Servlet容器会创建新的HttpSession对象,从而开始新的Session。


  • 在以下情况下,会话被销毁,即Servlet容器使HttpSession对象结束生命周期,并且存放在Session范围内的共享数据也都被销毁:
    • 浏览器进程终止
    • 服务器端执行HttpSession对象的invalidate()方法
    • Session过期
    • Tomcat为Session设定的默认的保持不活动状态的最长时间为1800秒


  • 当Tomcat中的Web应用被终止时,它的会话不会被销毁,而是被Tomcat持久化到永久性存储设备中,当Web应用重启后,Tomcat会重新加载这些会话


  • Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。


  • Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。


  • Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。





### Java Web 信息管理系统期末大作业示例教程 #### 创建项目结构 为了构建一个完整的Java Web信息系统,首先需要创建项目的目录结构。通常情况下,Web应用程序会遵循MVC模式来分离业务逻辑、数据访问和表示层。 ```plaintext MyWebApp/ ├── src/main/java/com/example/controller/ // 控制器类放置在此处 │ └── UserController.java // 用户控制器样例 ├── src/main/webapp/WEB-INF/jsp // JSP页面存储位置 │ ├── index.jsp // 主页视图 │ └── userForm.jsp // 表单编辑界面 └── pom.xml // Maven依赖配置文件 ``` #### 设计实体模型 定义`User`作为系统中的基本实体之一[^2]: ```java package com.example.model; public class User { private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; } } ``` 此部分展示了如何利用getter/setter方法实现属性封装,并可通过Spring框架下的XML配置完成对象实例化与初始化工作。 #### 开发Servlet组件 接下来开发处理HTTP请求的核心——Servlets。这里以登录验证为例说明其运作机制[^1]: ```java @WebServlet("/login") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{ String username=req.getParameter("username"); String password=req.getParameter("password"); UserService userService=new UserServiceImpl(); try { if(userService.login(username,password)){ HttpSession session=req.getSession(true); session.setAttribute("currentUser",userService.findByName(username)); RequestDispatcher dispatcher=getServletContext().getRequestDispatcher("/index.jsp"); dispatcher.forward(req,resp); }else{ resp.sendRedirect("error.html"); } } catch (Exception e){ throw new RuntimeException(e.getMessage()); } } } ``` 上述代码片段实现了简单的身份认证流程,成功后重定向至主页;失败则跳转错误提示页面。 #### 数据库交互模块 对于持久化的支持至关重要,在本案例中采用JDBC技术连接MySQL数据库并执行SQL语句进行增删改查操作[^5]: ```sql CREATE TABLE IF NOT EXISTS `users` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(30), `pwd` CHAR(64) ); INSERT INTO users(name,pwd) VALUES('admin',SHA2('Admin@123!',256)); SELECT * FROM users WHERE name=? AND pwd=SHA2(? ,256); ``` 以上脚本先确保存在名为`users`的数据表,接着插入一条管理员账户记录最后提供了一条安全的查询方式防止SQL注入攻击风险。 #### 功能扩展与其他特性集成 随着需求的增长还可以考虑加入更多实用的功能比如Excel报表生成功能[^3]: ```java private void exportToExcel(HttpServletResponse response,List<Course> coursesList) throws Exception{ HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet =workbook.createSheet("Selected Courses"); int rowNum = 0; Row row =sheet.createRow(rowNum++); Cell cell=row.createCell(0); cell.setCellValue("Course ID"); ... for(Course course :coursesList){ row=sheet.createRow(rowNum++); row.createCell(0).setCellValue(course.getId()); ... } response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Content-Disposition","attachment;filename=courses.xls"); OutputStream outputStream=response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); } ``` 这段程序能够帮助学生下载他们所选修过的全部课程列表为`.xls`格式文档形式保存下来以便日后查阅复习之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值