会话技术(Session)

您所在的位置:网站首页 服务器的应用范围是什么 会话技术(Session)

会话技术(Session)

2024-07-03 23:00| 来源: 网络整理| 查看: 265

会话技术(Session) 什么是会话? 会话:生活中 一次谈话 一次交谈 会话是浏览器和服务器之间的多次请求和响应 为了实现某一个功能(比如买东西),浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止,这期间产生的多次请求和响应加在一起就称之为浏览器和服务器之间的一次会话 web中的会话:指的是 浏览器与服务器建立的一次连接 这次连接 就称之为一次会话 在这次会话中 可以包含多次请求与多次响应 并且可以在多次请求和响应间进行数据共享 会话技术 解决多次请求间 数据共享的问题 保存会话中产生的数据

在一次会话中往往会产生一些数据,可以通过会话技术(Session和Cookie)保存会话中产生的数据

会话技术的概述 会话简单理解为:用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭浏览器,整个过程称为是一次会话 概述 客户端会话技术:Cookie 把数据保存在客户端 减轻服务器压力 不好之处 数据不安全 容易被篡改 服务端会话技术:Session 把数据存在服务端 增加了服务器的压力 数据安全 http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息。如果说我们要实现购物车添加或删除商品的功能的话,我们就需要使用到Cookie和Session技术。也就是说,Cookie和Session是域对象。所谓域就相当于给存储的内容设置一个边界,将存储的内容存储到这片区域内。

为什么有Cookie还要有Session

Session技术要依赖于cookie Session的实现原理 当浏览器第一次请求时 服务器会把数据存储到Session对象中 并通过set-cookie头将这个Session对象的id传回给浏览器 JESSIONID 当浏览器第二次请求时 浏览器将id传给服务器 服务器通过id来去除这个id的Session存储的数据

img

Session作为域对象的作用范围

Session作为域对象,作用范围就是一次会话的范围。一次会话,指的是用户打开浏览器点击多个超链接,访问服务器资源,到最后关闭浏览器的过程。

Session存储 1.获取session HttpSession session = request.getSession(); 2.存储数据 session.setAttribute("msg", "hehe"); 3.获取数据 Object msg = session.getAttribute("msg"); 正常存储读取 代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("session开始存储数据"); HttpSession session = request.getSession(); session.setAttribute("qing", "love u"); System.out.println("session存储完毕"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("session开始接受数据"); HttpSession session = request.getSession(); System.out.println(session.getAttribute("qing")); } 运行结果 session开始存储数据 session存储完毕 session开始接受数据 love u 浏览器关闭后 再次打开读取 数据无法共享 运行结果 session开始接受数据 null 服务器关闭后 浏览器不关闭 再次打开服务器读取 数据可以共享 服务器的钝化与活化机制 钝化:服务器正常关闭后 session对象被写入硬盘的文件中 会话:服务器开启后 将文件还原为内存的session对象 运行结果 session开始接受数据 love u Session对象的生命周期 何时创建和销毁的 创建:当用户向服务器发送一次请求 服务器创建一个request对象 销毁:当服务器对这次请求作出了响应 服务器就会销毁这个request对象 浏览器关闭了,session不一样了。 Cookie没了。jsessionid没了。 服务器关闭了,session一样吗?不一样。内存释放了。 优化:虽然对象不一样了,但是session中存储的数据还是一样的 钝化:服务器正常关闭后,session对象被写入硬盘的文件中 活化:服务器开启后,将文件还原为内存的session对象 Session总结 如何存取数据 存数据: void setAttribute(String name,Object value); 取数据 Object getAttribute(String name); 作用范围 作用范围:一次请求。(转发就是一次请求)

会话范围(HttpSession)

何时创建和销毁的 创建:服务器端**第一次调用getSession()**方法的时候。销毁:三种情况。 Session过期,默认的过期时间30分钟(web.xml中配置)。非正常关闭服务器。(正常关闭服务器—session会被序列化)。手动调用session.invalidate(); 如何存取数据 存数据: void setAttribute(String name,Object value); 取数据 Object getAttribute(String name); 作用范围 作用范围:一次会话(多次请求)

应用范围(ServletContext)

何时创建和销毁的

创建:服务器启动的时候创建,为每个web项目创建一个单独ServletContext对象。销毁:服务器关闭的时候,或者项目从服务器中移除的时候。 session超时 30 invalidate() :session自杀了。

如何存取数据

存数据: void setAttribute(String name,Object value); 取数据 Object getAttribute(String name);

作用范围

作用范围:整个应用 获取session getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session getSession(boolean flag): true:默认值,会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null

session验证码

public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ // 1.接收数据 // 处理中文乱码 request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); // 一次性验证码的校验 // 接收验证码 String checkcode1 = request.getParameter("checkcode"); // 从session中获取一次性验证码的值: String checkcode2 = (String) request.getSession().getAttribute("checkcode"); // 为了保证验证码使用一次:应该将session中的验证码值清空 request.getSession().removeAttribute("checkcode"); // 校验一次性验证码: if(!checkcode1.equalsIgnoreCase(checkcode2)){ request.setAttribute("msg", "验证码输入错误!"); request.getRequestDispatcher("/login.jsp").forward(request, response); return; } // 2.封装数据 User user = new User(); user.setUsername(username); user.setPassword(password); // 3.处理数据 UserModel userModel = new UserModel(); User existUser = userModel.login(user); // 4.页面跳转 if(existUser == null){ // 登录失败 // 向request域中保存一个错误信息: request.setAttribute("msg", "用户名或密码错误!"); // 使用请求转发进行页面跳转 request.getRequestDispatcher("/login.jsp").forward(request, response); }else{ // 登录成功 // 保存用户的信息:保存到会话当中。 HttpSession session = request.getSession(); // 保存数据: session.setAttribute("existUser", existUser); // 记住用户名: // 判断复选框是否已经勾选了: String remember = request.getParameter("remember"); if("true".equals(remember)){ // 已经勾选了: Cookie cookie = new Cookie("remember",existUser.getUsername()); // 设置有效路径: cookie.setPath("/web03_login"); // 设置有效时长: cookie.setMaxAge(60*60*24); // 将Cookie回写到浏览器 response.addCookie(cookie); } // 重定向到成功页面 response.sendRedirect("/web03_login/success.jsp"); } }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 注意事项 如果客户端禁用了 cookie,session该如何自处? 客户端禁用了cookie,session将不一样。 URL重写:http://localhost:8080/day09/s1;jsessionid=E5F92CFD2B256EE2548AE01CC56B2E62 PrintWriter pw = response.getWriter(); HttpSession session = request.getSession(); String id = session.getId(); String href = "/day09/s1"; href = response.encodeRedirectURL(href); System.out.println(href); pw.write("s1"); 使用情景 * 分析数据使用几次? * 一次:request,转发 * 一个用户多次 session,重定向 * 所有用户共享: ServletContext 重定向


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3