【总结归纳1】JavaWeb之会话管理技术

会话管理

存储在客户端
即服务器识别
● 一次会话之间共享数据(几台浏览器就有几次会话)
● 用于在不同请求间实现数据共享
一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
● 服务器会收到多个请求,这多个请求可能来自多个浏览器
● 服务器需要用来识别请求是否来自同一个浏览器
● 服务器用来识别浏览器的过程
● 服务器识别浏览器后就可以在同一个会话中多次请求之间来共享数据

会话

即Web开发中的一次通话过程,当打开浏览器,访问网站地址后,会话开始;关闭浏览器(或到了过期时间),会话结束。
用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
● 从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了
● 会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着
● 浏览器和服务器就可以继续使用该会话进行请求发送和响应
浏览器和服务器不支持数据共享
● 浏览器和服务器之间使用的是HTTP请求来进行数据传输
● HTTP协议是无状态的(—>靠HTTP协议无法实现会话跟踪),每次浏览器向服务器请求时,服务器都会将该请求视为新的请求
● HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响
● 请求与请求之间独立后,就无法实现多次请求之间的数据共享

会话技术分类

cookie

客户端会话技术,
将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
即把要共享的数据保存到客户端(即浏览器端);每次请求时,把会话信息(即cookie数据)带到服务器,从而实现多次请求的数据共享。

cookie定义

客户端浏览器的缓存文件,记录了客户浏览器访问网站的一些内容;同时也是HTTP协议请求和响应消息头的一部分

Cookie的基本使用
发送Cookie

● 创建Cookie对象,并设置数据
Cookie cookie = new Cookie(“key”,“value”);
● 发送Cookie到客户端:使用response对象
response.addCookie(cookie);

example
@WebServlet("/ServletCreateC")
public class ServletCreateC extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //1.创建cookie:存中文的时候一定要编码解码
        String 张三 = URLEncoder.encode("张三", "utf-8"); //对中文进行编码,再存进cookie
        Cookie cookie=new Cookie("name",张三);  //键值 value值

            //cookie周期:默认下浏览器一关闭就没有cookie了
            //1.1设置cookie存活时间:秒数;0:立即删除;负数:代表关闭即消亡;正数:cookie存活时间
        cookie.setMaxAge(60*60*24*7); //可读性好;保存7天;当写入负数,即默认浏览器一关闭则cookie就消失
        // 2.保存到浏览器
        response.addCookie(cookie); //将cookie保存到resp对象中
        //默认把所有cookie发给浏览器

    }
}
获取Cookie

● 获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies();
● 遍历数组,获取每一个Cookie对象:for
● 使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
设置Cookie存活时间
setMaxAge(int seconds)
参数值为:
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
存储中文的编码与解码
在AServlet中对中文进行URL编码,采用URLEncoder.encode(),将编码后的值存入Cookie中
2.在BServlet中获取Cookie中的值,获取的值为URL编码后的值

3.将获取的值在进行URL解码,采用URLDecoder.decode(),就可以获取到对应的中文值
example

@WebServlet("/ServletGetCookie")
public class ServletGetCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie[] cookie=request.getCookies();//获取全部cookie
        boolean flag=false;
        for (Cookie c:cookie //對cookie數組進行遍历
             ) {
            String n=c.getName();
            if("name".equals(n)){
                //对传进来的name值进行解码
                System.out.println(URLDecoder.decode(c.getValue(),"utf-8"));
                flag=true;
            }
        }
        if(flag){
            System.out.println("已登录,无需重复登录");
        }else{
            System.out.println("未登录");
        }
    }
}
cookie原理分析

基于HTTP协议的,其中设计到HTTP协议中的两个请求头信息:
● 响应头:set-cookie
● 请求头: cookie

● AServlet给前端发送Cookie,BServlet从request中获取Cookie的功能
● 对于AServlet响应数据的时候,Tomcat服务器都是基于HTTP协议来响应数据
● 当Tomcat发现后端要返回的是一个Cookie对象之后,Tomcat就会在响应头中添加一行数据Set-Cookie:username=zs
● 浏览器获取到响应结果后,从响应头中就可以获取到Set-Cookie对应值username=zs,并将数据存储在浏览器的内存中
● 浏览器再次发送请求给BServlet的时候,浏览器会自动在请求头中添加Cookie: username=zs发送给服务端BServlet
● Request对象会把请求头中cookie对应的值封装成一个个Cookie对象,最终形成一个数组
● BServlet通过Request对象获取到Cookie[]后,就可以从中获取自己需要的数据
cookie使用细节
● 设置Cookie存活时间
setMaxAge(int seconds)
参数值为:
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
存储中文的编码与解码
.在AServlet中对中文进行URL编码,采用URLEncoder.encode(),将编码后的值存入Cookie中
2.在BServlet中获取Cookie中的值,获取的值为URL编码后的值
3.将获取的值在进行URL解码,采用URLDecoder.decode(),就可以获取到对应的中文值

session

服务端会话技术
将数据存储在服务端;一个会话一个session;
基于cookie,即保存到客户端的是一个特殊标识,并把共享数据保存到服务端的内存对象中。每次请求时,把该标识带到服务器端,然后使用该标识,找到对应的内存空间,从而实现数据共享。

原理分析:

A浏览器中第一次访问服务端(即创建session和cookie),当之后多次存储都可以访问到;
B浏览器中第一次访问服务端(即创建session和cookie);
服务端如何区分不同浏览器——>session基于cookie实现,每次访问时通过cookie区分不同浏览器,没有cookie就取不到session

基本使用

● 获取Session对象,使用的是request对象
HttpSession session = request.getSession();
● Session对象提供的功能:
○ 存储数据到 session 域中
void setAttribute(String name, Object o)
○ 根据 key,获取值
○ Session中可以存储的是一个Object类型的数据,也就是说Session中可以存储任意数据类型。
Object getAttribute(String name)
○ 根据 key,删除该键值对
void removeAttribute(String name)
Session是能够在一次会话中两次请求之间共享数据。

session的活化和钝化

服务器重启后session一般也不能消失
● 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
○ 钝化的数据路径为:项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser
● 活化:再次启动服务器后,从文件中加载数据到Session中
○ 数据加载到Session中后,路径中的SESSIONS.ser文件会被删除掉

注意

● session数据存储在服务端,服务器重启后,session数据会被保存
● 浏览器被关闭启动后,重新建立的连接就已经是一个全新的会话,获取的session数据也是一个新的对象
● session的数据要想共享,浏览器不能关闭,所以session数据不能长期保存数据
● cookie是存储在客户端,是可以长期保存
Session销毁

  1. 默认情况下,无操作,30分钟自动销毁
    ● 在项目的web.xml中配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <session-config>
        <session-timeout>100</session-timeout>
    </session-config>
</web-app>

● 如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中写死的
2. 调用Session对象的invalidate()进行销毁

session和cookie区别

共同点:
在这里插入图片描述
应用场景:
● 购物车:使用Cookie来存储
● 以登录用户的名称展示:使用Session来存储
● 记住我功能:使用Cookie来存储

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值