前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >九、状态管理

九、状态管理

作者头像
Qwe7
发布2022-07-24 08:21:37
3730
发布2022-07-24 08:21:37
举报
文章被收录于专栏:网络收集网络收集

九、状态管理

9.1 现有问题

  • HTTP协议是无状态的,不能保存每次提交的信息
  • 如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系。
  • 对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就成问题了。

9.2 概念

将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来。

  • 客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术。
  • 服务器状态管理技术:将状态保存在服务器端。代表性的是session技术(服务器传递sessionID时需要使用Cookie的方式)

9.3 什么是Cookie

  • Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应消息头中附带传送给浏览器的一小段数据。
  • 一旦Web浏览器保存了某个Cookie,那么它在以后每次访问该Web服务器时,都应在HTTP请求头中将这个Cookie回传给Web服务器。
  • 一个Cookie主要由标识该信息的名称(name)和值(value)组成。

9.4 Cookie使用

代码语言:javascript
复制
//创建Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/webs");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0浏览器关闭;<0内存存储,默认-1
response.addCookie(ck);//添加到response对象中,响应时发送给客户端
//注意:有效路径: 当前访问资源的上一级目录,不带主机名
  • chrome浏览器查看cookie信息:chrome://settings/content/cookies

获取Cookie

代码语言:javascript
复制
//获取所有的Cookie
Cookie[] cks=request.getCookies();
		//遍历Cookie
		for(Cookie ck:cks){
          //检索出自己的Cookie
			if(ck.getName().equals("code"))
			{
              //记录Cookie的值
				code=ck.getValue();
				break;
			}
}

修改Cookie

只需要保证Cookie的名和路径一致即可修改

代码语言:javascript
复制
	//修改Cookie
    Cookie ck=new Cookie("code", code);
    ck.setPath("/webs");//设置Cookie的路径
    ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
    response.addCookie(ck);//让浏览器添加Cookie
  • 注意:如果改变cookie的name和有效路径会新建cookie, 而改变cookie值、有效期会覆盖原有cookie

9.5 Cookie编码与解码

Cookie默认不支持中文,只能包含ASCII字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码。

  • 编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法
  • 解码使用java.net.URLDecoder类的decode(String str,String encoding)方法

1.创建带中文Cookie

代码语言:javascript
复制
 // 使用中文的 Cookie. name 与 value 都使用 UTF-8 编码. 
    Cookie cookie = new Cookie(
        URLEncoder.encode("姓名", "UTF-8"), 
        URLEncoder.encode("老邢", "UTF-8"));
    // 发送到客户端   
    response.addCookie(cookie);

2.读取带中文Cookie

代码语言:javascript
复制
    if(request.getCookies() != null){
        for(Cookie cc : request.getCookies()){
            String cookieName = URLDecoder.decode(cc.getName(), "UTF-8");
            String cookieValue = URLDecoder.decode(cc.getValue(), "UTF-8");
            out.println(cookieName + "=");
            out.println(cookieValue + "; <br/>");
        }
    }
    else{
        out.println("Cookie 已经写入客户端. 请刷新页面. ");
    }

9.6 Cookie优点和缺点

1.优点

  • 可配置到期规则。
  • 简单性:Cookie 是一种基于文本的轻量结构,包含简单的键值对。
  • 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的。

2.缺点

  • 大小受到限制:大多数浏览器对 Cookie 的大小有 4K、8K字节的限制。
  • 用户配置为禁用:有些用户禁用了浏览器或客户端设备接收 Cookie 的能力,因此限制了这一功能。、
  • 潜在的安全风险:Cookie 可能会被篡改。会对安全性造成潜在风险或者导致依赖于Cookie 的应用程序失败。

9.7 Session概述

  • Session用于记录用户的状态。Session指的是在一段时间内,单个客户端与Web服务器的一连串相关的交互过程。
  • 在一个Session中,客户可能会多次请求访问同一个资源,也有可能请求访问各种不同的服务器资源。

9.8 Session原理

  • 服务器会为每一次会话分配一个Session对象
  • 同一个浏览器发起的多次请求,同属于一次会话(Session)
  • 首次使用到Session时,服务器会自动创建Session,并创建Cookie存储SessionId发送回客户端
  • 注意:session是由服务端创建的。

9.9 Session使用

  • Session作用域:拥有存储数据的空间,作用范围是一次会话有效
    • 一次会话是使用同一浏览器发送的多次请求。一旦浏览器关闭,则结束会话
    • 可以将数据存入Session中,在一次会话的任意位置进行获取
    • 可传递任何数据(基本数据类型、对象、集合、数组)

1.获取Session

session是服务器端自动创建的,通过request对象获取

代码语言:javascript
复制
//获取Session对象
HttpSession session=request.getSession();
System.out.println("Id:"+session.getId());//唯一标记,

2.Session保存数据

setAttribute(属性名,Object)保存数据到session中

session.setAttribute("key",value);//以键值对形式存储在session作用域中。

3.Session获取数据

getAttribute(属性名);获取session中数据

session.getAttribute("key");//通过String类型的key访问Object类型的value

4.Session移除数据

removeAttribute(属性名);从session中删除数据

session.removeAttribute("key");//通过键移除session作用域中的值

5.Session与Request应用区别

  • request是一次请求有效,请求改变,则request改变
  • session是一次会话有效,浏览器改变,则session改变

6.Session应用

代码语言:javascript
复制
package com.qf.sessions;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "SessionServlet",value = "/ss")
public class SessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.通过request对象获取Session对象
        HttpSession session = request.getSession();

        //2.使用session保存数据
        session.setAttribute("username","gavin");
        request.setAttribute("password","123456");

        response.sendRedirect("/WebProject_war_exploded/getValue");
        System.out.println(session.getId());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

7.GetValueServlet.java

代码语言:javascript
复制
package com.qf.sessions;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "GetValueServlet",value = "/getValue")
public class GetValueServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.通过request获取session对象
        HttpSession session = request.getSession();

        String password = (String)request.getAttribute("password");
        String s = (String) session.getAttribute("username");

        System.out.println("从session中获得了:"+s);
        System.out.println("从reqeust中获得了:"+password);


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

9.10 Session的生命周期

  • 开始:第一次使用到Session的请求产生,则创建Session
  • 结束:
    • 浏览器关闭,则失效
    • Session超时,则失效
      • session.setMaxInactiveInterval(seconds);//设置最大有效时间(单位:秒)
    • 手工销毁,则失效
      • session.invalidate();//登录退出、注销

1.Session失效

代码语言:javascript
复制
	session.setMaxInactiveInterval(60*60);//设置session最大有效期为一小时
	session.invalidate();//手工销毁

9.11 浏览器禁用Cookie解决方案【了解】

1. 浏览器禁用Cookie的后果

服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁止Cookie,则sessionID不会被浏览器保存,此时,服务器可以使用如URL重写这样的方式来发送sessionID。

2.URL重写

浏览器在访问服务器上的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即在原来的地址后面加上了sessionID)。

3.实现URL重写

response.encodeRedirectURL(String url)生成重写的URL。

代码语言:javascript
复制
    HttpSession session = request.getSession();
	//重写URL追加SessionId
    String newUrl = response.encodeRedirectURL("/WebProject_war_exploded/cs");
    System.out.println(newUrl);
	response.sendRedirect(newUrl2);

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 九、状态管理
    • 9.1 现有问题
      • 9.2 概念
        • 9.3 什么是Cookie
          • 9.4 Cookie使用
            • 9.5 Cookie编码与解码
              • 9.6 Cookie优点和缺点
                • 9.7 Session概述
                  • 9.8 Session原理
                    • 9.9 Session使用
                      • 9.10 Session的生命周期
                        • 9.11 浏览器禁用Cookie解决方案【了解】
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档