欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > 【后端】会话管理-cookiesession

【后端】会话管理-cookiesession

2024/10/24 1:02:11 来源:https://blog.csdn.net/m0_75163045/article/details/143162902  浏览:    关键词:【后端】会话管理-cookiesession

一、会话管理定义

  会话管理Session Management)是 Web 开发中的一项关键技术,用于在用户与服务器之间的多次交互中维持状态。

会话:建立连接,相互交流。

eg:客户端和服务端交流

客户端发起请求,服务端被动请求


二、会话管理原因:

   HTTP 协议本质上是无状态的,这意味着每次请求都是独立的,每次连接只处理一个请求,服务器不会记住之前的请求。因此,会话管理被引入以在用户与服务器之间的多个请求中保存和管理用户的状态信息。

• 对于简单的页面浏览或信息获取,HTTP协议即可胜任
    – 浏览资讯
    – 查看在线图书目录
• 对于需要客户端和服务器端多次交互的网络应用,则必须记住客户端状态
    – 网上的购物车
    – 用户登录


三、会话分类

3.1 会话分为

  1. 有状态会话:知道说话的这方一直都是你
  2. 无状态会话:不知道是不是都是同一个人

$ .举个例子说明:

eg :

有状态会话:对于服务端,是知道是edge发出的请求

eg:

无状态会话: 接受了四个请求,不知道是哪个来的


3.2 实现

购物车: 用自己的账号登录,查找购物车的信息---->两个请求之间有关联

3.2.1会话管理:

客户端技术:把状态保存在客户端   --cookie

自己保存自己的信息,每次都要携带上自己的信息


3.2.2 cookie

cookie

是服务器创建的,通过响应发送给客户端浏览器,并保存在浏览器上的一小块信息,

浏览器在下次向服务器发起请求时被携带并发送到浏览器上。

$1.简述过程:

第一次请求

创建cookie对象, 并通过response将cookie响应给客户端

客户端接收服务端响应的cookie信息,并保存。

当发出第二次请求时,客户端携带cookie信息走向服务端,服务端从请求中读取cookie信息。

以后的请求中,客户端携带cookie信息走向服务端,服务端从请求中读取cookie信息。

$2. 具体过程如下

$1. 创建并向客户端发送Cookie

创建Cookie对象
– 调用Cookie的构造方法,给出Cookie的名称和Cookie的值,二者都是字符串
        Cookie c = new Cookie(“userName”,”1234”)

设置最大时效
– 要告诉浏览器将Cookie存储到磁盘上,而非仅保存在内存中,

-- 设置cookie有效期 使用setMaxAge方法 单位秒

        >0表示cookie有效期

        =0删除cookie

        <0 会话Cookie

– c.setMaxAge(60*60*24*7)//一周(正数)

将Cookie放入到HTTP响应中
– 使用response.addCookie(c)
– 如没有这一步,将不会有任何Cookie被发送到浏览器
 

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//创建cookieCookie cookie=new Cookie("account","admin");//设置cookie有效期  单位秒//		>0表示cookie有效期
//		=0删除cookie
//		<0 会话cookiecookie.setMaxAge(-1);
//		将cookie响应给客户端response.addCookie(cookie);}

$2. 从客户端读取Cookie 

调用request.getCookies
    – 得到Cookie对象组成的数组
    – 循环数组,调用每个对象的getName找到想要的cookie   无法指定
    – 根据应用程序调用getValue方法使用这个Cookie
 

/		getCookies() 读取cookie信息
//		getName()  读取前面的关键字name值  无法指定
//		getValue()  读取value值Cookie[] cookies = request.getCookies();for(int i=0;i<cookies.length;i++) {System.out.println(cookies[i].getName()+"---------->"+cookies[i].getValue());if(cookies[i].getName().equals("account")) {System.out.println(cookies[i].getValue());}}
一些基本方法:

split        把字符串分割成字符串数组

split("")   把字符串当中的每一个字符都分割,包括空格

split(";")

trim()      去除字符串两边的空格

indexOf()  判断有没有字符串,有返回匹配的第一个串的第一个位置,没有返回-1

indexOf("",n)   跳过n个元素后查找这个字符串

lastIndexOf()   返回最后一个字符串的第一个位置,没有返回-1

substring()   字符串裁剪,要头不要尾

 $3.cookie优缺点

优点

  • cookie可以设置到期规则,只要不清,默认在过期之前会一直保存在浏览器上
  •  cookie包含简单的键值对

缺点

  • cookie大小受限制,大多数浏览器对cookie的大小有限制,一般是4kB,8KB;
  • 对同一个域名下 对cookie的总数量有限制;
  •  设置cookie禁用之后,cookie就用不了了;
  •  潜在的安全风险,cookie可能会被篡改;

3.2.3 session

服务器技术:把状态保存在服务器---- session

稍微带一点唯一标识符

服务器为每个用户浏览器创建一个会话对象(session对象)

$1.简述过程

 第一次请求

服务端  创建session对象,对应jsessionid ,将jsessionid返回客户端 。

客户端  接收服务端返回的jsessionid,将jsessionid存储在cookie中。

当发出第二次请求时,客户端  携带jsessionid信息走向服务端,服务端  判断有没有携带jsessionid信息。没有携带就是第一次访问,创建session对象...;若携带,读取session对象中的信息。

以后的请求中,客户端  携带jsessionid信息走向服务端,服务端  判断有没有携带jsessionid信息。没有携带就是第一次访问,创建session对象...;若携带,读取session对象中的信息。

$2. 具体过程如下:

$1. 获取session对象

HttpSession session = request.getSession();

$2. 设置值   setAttribute()

session.setAttribute("account", "666");session.setAttribute("password", "777");session.setAttribute("key", "value");

$3. 获取session对象

HttpSession session = request.getSession();

$4. 获取值

 getId()获取sessionid
 getAttribute()获取值

System.out.println(session.getId());System.out.println("账号:"+session.getAttribute("account"));System.out.println("密码:"+session.getAttribute("password"));System.out.println("key:"+session.getAttribute("key"));

$5.  根据需要关闭会话

  •  session.invalidate();
  •  通常客户端不提供结束会话的通知,而是Servlet容器在用户处于一段非 活动期后就会自动的使会话失效——这个时间段称为会话的超时期 

 重写url:

当用户浏览器禁用Cookie时,仍打算运用Session来进行会话管理,可以对所有的URL使用URL重写 

String newURL=response.encodeRedirectURL("GetSession");System.out.println(newURL);

请求转发和重定向

请求转发是一种服务器行为,当用户请求到达之后,服务器对请求进行转发

       只有一个请求发出

       地址栏不发生改变

       request在servlet中共享

       转发的只能是本网站内的资源

重定向 是一种服务器指导的客户端行为

客户端发起第一个请求,这个请求被服务器接收,服务器会返回给客户端一个新的地址,客户端接收到新地址之后会根据新地址再次发起新的请求

        发起了两次请求

        地址栏发生改变

         request中的数据在servlet中不共享

         重定向可以跳转到任意网站内的资源

response.sendRedirect(newURL);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com