php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07

简介: 本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。

前几篇笔记中已经提到过 $_GET 和 $_POST 以及 $_FILES,这篇笔记就将$_REQUEST $_SERVER 和 $_COOKIE $_SESSION来简单说明一下.

1、$_REQUEST

使用$_REQUEST既可以获取GET方式提交的数据,也可以获取POST方式提交的数据 $_REQUEST = array_merge( $_GET,$_POST)

<form action="req.php" method="post">
    <input type="text" name="t1"><br>
    <input type="submit" value="提交">
</form>

<br>

<form action="req.php" method="get">
    <input type="text" name="t2"><br>
    <input type="submit" value="提交">
</form>
<?php
// 获取表单参数 并且 使用 $_REQUEST 来获取表单的参数

// 因为两个表单的数据name值不一样,且为了安全,判断一下 获取到的数据是否是定义过的

if(isset($_REQUEST['t1'])){
   
    echo $_REQUEST['t1']."我是post提交的表单"."</br>";
}


if(isset($_REQUEST['t2'])){
   
    echo $_REQUEST['t2']."我是get提交的表单"."</br>";
}

当采用GET 和 POST 混合提交数据的方式后,预定义变量是使用了POST还是GET提交的参数,与php.ini配置文件有关.
request_order = “GP” ,GP 决定 预定义变量GET 和 POST提交的顺序 (感觉画蛇添足,没啥大用处),只要知道使用 $_REQUEST预定义变量可以获取POST和GET方式提交的数据即可

2、$_SERVER

通过$_SERVER获取服务器主机和浏览器的一些相关信息

预定义变量使用 功能
$_SERVER[“REMOTE_ADDR”] 浏览器主机IP
$_SERVER[“SERVER_ADDR”] 服务器主机IP
$_SERVER[“SERVER_NAME”] 服务器主机名
$_SERVER[“SERVER_PORT”] 服务器占用端口号
$_SERVER[“HTTP_HOST”] 服务器主机名
$_SERVER[“PHP_SELF”] 当前执行php程序的相对路径
$_SERVER[“QUERY_STRING”] 查询字符串
$_SERVER[“DOCUMENT_ROOT”] web服务器根目录
$_SERVER[“REQUEST_URI”] 请求URI

tip:$_SERVER["QUERY_STRING"] 需要在url进行拼接才会显示 req.php?xxx=yyy&zzz=mmm 这样

使用如下:

一个表单:

<form action="req.php" method="post">
    <input type="text" name="t3"><br>
    <input type="submit" value="提交">
</form>

处理表单请求参数并且显示的页面 req.php

// 通过$_SERVER获取服务器主机的一些相关信息
if(isset($_REQUEST['t3'])){
   
    echo "浏览器主机IP-".$_SERVER["REMOTE_ADDR"]."<br>"; //::1
    // 有的web服务器不支持 这个 $_SERVER["SERVER_ADDR"]
    echo "服务器主机IP-". $_SERVER["SERVER_ADDR"]."<br>";
    echo "服务器主机名-".$_SERVER["SERVER_NAME"]."<br>";// localhost
    echo "服务器占用端口号-".$_SERVER["SERVER_PORT"]."<br>";// 81
    echo "服务器主机名-".$_SERVER["HTTP_HOST"]."<br>";//localhost:81
    echo "当前程序的执行相对路径名-".$_SERVER["PHP_SELF"]."<br>";//   /req.php
    echo "查询字符串-".$_SERVER["QUERY_STRING"]."<br>";// 需要在url进行拼接才会显示  req.php?xxx=yyy&zzz=mmm 这样
    echo "web服务器根目录-".$_SERVER["DOCUMENT_ROOT"]."<br>";//D:\phpstudy_pro\WWW\phpProjects\demo1
    echo "请求URI-".$_SERVER["REQUEST_URI"]."<br>";// /req.php
}

3、$_COOKIE

cookie 常用于识别用户(比如账号的自动登录)。cookie 是一种服务器留在用户计算机上的小文件。

cookie 是一组"键值对"信息,该信息由web服务器的php程序生成,最终保存到浏览器端主机内存或者浏览器端主机硬盘文件中。

在这里插入图片描述

3.1 cookie的内容

Cookie是一段不超过4KB的小型文本数据,由一个键值对,和其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。

(1)name 和 value:设置Cookie的标记名称(字符串)及相对应的值,对于认证Cookie,Value值包括Web服务器所提供的访问令牌 。

(2)expire属性:设置Cookie的生存期(过期时间),通常为整数数据类型。有两种存储类型的Cookie:会话性与持久性。expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效 。

(3)path属性:指定Cookie在web服务器的有效路径,即web服务器访问站点。。

(4)domain属性:指定了可以访问该 Cookie 的 有效域名。

(5)secure属性:指定Cookie 信息是通过 Http协议还是 Https协议加入请求头,取值范围为 true | flase。默认值为false,表示只有使用Http协议时才将cookie加入请求头中;true的话就是使用Https协议才…

3.2 cookie的分类

有两种存储类型的Cookie:会话性与持久性。expires属性缺省时,为会话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效

  • 会话cookie

    会话cookie仅保存在客户端内存中,并在用户关闭浏览器时失效.会话cookie的典型应用是实现session会话技术。

  • 持久cookie

    持久性Cookie会保存在用户的硬盘中。
    持久性Cookie失效的情况及原因:

    • 当cookie的过期时间到了以后,cookie失效
    • 浏览器用户手动删除cookie(清理缓存)
    • 浏览器主机存放的cookie太多,浏览器自动清除cookie.

3.3 php中cookie的使用

使用 setcookie()函数 或者 header()函数 ,可以在php中自行设定cookie.

setcookie()函数
语法格式:bool setcookie(string name [ [ [ [ ,string value], int exprie ], string path ], string domain ], int secure)
函数功能: 成功创建cookie则返回true,否则返回false

header()函数
直接通过 header("Set-Cookie:name=value")即可在请求头中添加cookie。

tip:一般设定cookie的过期时间即expire属性值时,使用 time() 函数 或者 mktime() 函数。

time() 函数
语法格式: int time(void)
函数功能:返回一个时间戳(从1970-1-1到目前时间)

cookie的删除:
使用 setcookie()函数将cookie的值设置为空,或者使用setcookie()函数将expire过期时间设置为过去的时间,即可删除cookie.

3.4 cookie自动登录小demo

login.php:

<?php
    // cookie的获取,用于实现自动登录
    $uName ="";
    $uPwd ="";
    if(isset($_COOKIE['uName'])){
   
        $uName = $_COOKIE['uName'];
    }
    if(isset($_COOKIE['uPwd'])){
   
        $uPwd = $_COOKIE['uPwd'];
    }
?>

<!--创建一个登录表单-->
<form action="checkLogin.php" method="post">
    账号:<input type="text" name="uName" value="<?php echo $uName?>"><br>
    密码:<input type="password" name="uPwd" value="<?php echo $uPwd?>"><br>
    <input type="submit" value="提交">
</form>

checkLogin.php:

<?php

// 1.使用 $_REQUEST 来获取表单参数

$uName = $_REQUEST['uName'];
$uPwd = $_REQUEST['uPwd'];

// 2.登录验证,如果是 admin  1234,则允许登录
$flag1 = boolval("admin"==$uName&&1234==$uPwd);
if($flag1 ){
   
    echo "登录成功"."<br>";
    echo "账号:".$uName."<br>密码:".$uPwd."<br>";
}
if (!$flag1){
   
    echo "登录失败请重新登录!点击下面的链接即可返回登录页面"."<br>";
    echo "<a href='login.php'>返回登录页面</a>";
}

// 3.设定用户登录cookie,只要不超过cookie的过期时间,下次就可以自动登录啦
$expireTime = intval(60*60*24*3);// 3天  60*60*24*3 设定cookie的过期时间是三天
setcookie("uName",$uName,time()+$expireTime);// 设置 cookie
setcookie("uPwd",$uPwd,time()+$expireTime);
echo "你的账号信息已经存放与cookie中,".$expireTime."秒 后过期";

运行图:
在这里插入图片描述

使用F12开发者工具对网络进行抓包查看,我们自己设定的cookie是否存在于请求头中。

在这里插入图片描述
在这里插入图片描述

再次回到login.php,发现cookie已经自动填充好啦

在这里插入图片描述

4、$SESSION

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去,当浏览器关闭时,会话cookie从浏览器中删除,与浏览器cookie对应的session依旧存在,直到当服务器关闭,session销毁失效,或者session的过期时间到了session失效

cookie不设置过期时间的会话就是session,cookie保存至浏览器端,session文件保存在服务器的硬盘中。

php中提供了预定义变量$_SESSION用来解析和修改Session文件PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

4.1 session的工作原理

session的工作原理:
(1)当一个session第一次被启用时,一个独一的标识被存储于本地的cookie中。
(2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
(3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
(4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

4.2 session的使用

4.2.1 修改php.ini中的session配置

php.ini配置文件中有一组Session的配置选项,用于管理Session的自身属性。

  • 1.session.save_hanler = files :设置服务器保存用户个人信息的保存方式,默认为“files”,表示用文件存储session信息。如果想要使用数据库存储session信息,则将其改为 session.save_hanler = user。
  • 2.session.save_path = "自定义路径": 在save_handler设为files时,用于设置session文件的保存路径。
  • 3.session_use_cookies =1:默认值为1,代表SessionID使用cookie传递,为0时使用查询字符串传递sessionID.
  • 4.session.name = PHPSESSID:session的名称,默认值为"PHPSESSID"。
  • 5.session.auto_start=0:浏览器请求服务器页面时,是否自动开启session,默认值为0,表示不自动开启session。
  • 6.session.cookie_lifetime =0:设置sessionID在cookie中的过期时间,默认值为0(浏览器关闭sessionID即失效)。
  • 7.session.cookie_path= / :使用cookie传递sessionID时cookie的有效路径,默认为/
  • 8.session.cookie_domain = : 使用cookie传递sessionID时cookie的有效域名,默认为空。
  • 9.session.gc_maxlifetime = 1440,设置session文件中的最大过期时间,默认为1440秒,即如果1440秒之内没有访问session文件,则该session文件失效。

下面的是session在php.ini中默认的配置:

[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
session.save_handler = files

; Argument passed to save_handler.  In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
;
; The path can be defined as:
;
;     session.save_path = "N;/path"
;
; where N is an integer.  Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
; store the session data in those directories.  This is useful if
; your OS has problems with many files in one directory, and is
; a more efficient layout for servers that handle many sessions.
;
; NOTE 1: PHP will not create this directory structure automatically.
;         You can use the script in the ext/session dir for that purpose.
; NOTE 2: See the section on garbage collection below if you choose to
;         use subdirectories for session storage
;
; The file storage module creates files using mode 600 by default.
; You can change that by using
;
;     session.save_path = "N;MODE;/path"
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
; http://php.net/session.save-path
;session.save_path = "/tmp"

; Whether to use strict session mode.
; Strict session mode does not accept an uninitialized session ID, and
; regenerates the session ID if the browser sends an uninitialized session ID.
; Strict mode protects applications from session fixation via a session adoption
; vulnerability. It is disabled by default for maximum compatibility, but
; enabling it is encouraged.
; https://wiki.php.net/rfc/strict_sessions
session.use_strict_mode = 0

; Whether to use cookies.
; http://php.net/session.use-cookies
session.use_cookies = 1

; http://php.net/session.cookie-secure
;session.cookie_secure =

; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combating
; session hijacking when not specifying and managing your own session id. It is
; not the be-all and end-all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 1

; Name of the session (used as cookie name).
; http://php.net/session.name
session.name = PHPSESSID

; Initialize session on request startup.
; http://php.net/session.auto-start
session.auto_start = 0

; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://php.net/session.cookie-lifetime
session.cookie_lifetime = 0

; The path for which the cookie is valid.
; http://php.net/session.cookie-path
session.cookie_path = /

; The domain for which the cookie is valid.
; http://php.net/session.cookie-domain
session.cookie_domain =

; Whether or not to add the httpOnly flag to the cookie, which makes it
; inaccessible to browser scripting languages such as JavaScript.
; http://php.net/session.cookie-httponly
session.cookie_httponly =

; Add SameSite attribute to cookie to help mitigate Cross-Site Request Forgery (CSRF/XSRF)
; Current valid values are "Strict", "Lax" or "None". When using "None",
; make sure to include the quotes, as `none` is interpreted like `false` in ini files.
; https://tools.ietf.org/html/draft-west-first-party-cookies-07
session.cookie_samesite =

; Handler used to serialize data. php is the standard serializer of PHP.
; http://php.net/session.serialize-handler
session.serialize_handler = php

修改一下session文件的保存路径
在这里插入图片描述

4.2.2 开启session

session的使用不同于cookie,必须在php程序中调用session_start()函数启动session后才能使用session.

session_start()

语法格式:bool session_start ( void )

函数功能如下:

  • 1.加载php.ini配置文件中session的配置信息(session的生存周期,session的保存路径)加载到web服务器的内存中。

  • 2.创建SessionId 或者使用原有的SessionID。若Cookie请求头中不存在相应的SessionID则表示第一次访问,则创建一个新的SessionID来标识,若已经存在,则直接使用Cookie请求头中的已有的SessionID.

  • 3.在web服务器创建Session文件或者解析已有的Session文件.如果是新的SessionID,则创建Session文件,$_SESSION为空数组,反之若是已经存在的SessionID,则直接将Session文件中的内容到$_SESSION数组中。

  • 4.产生Cookie响应头信息,Cookie响应头会随着响应发送给浏览器。(响应头形如 ``)

4.2.3 删除和销毁session

php提供了session_unset() 和 session_destory()用来删除session数据。

session_unset()用于释放指定的 session 变量,只清空对应SessionID的数据,保留SessionID。
语法格式:void session_unset( void )

session_destory()用于彻底删除销毁session,SessionID也被清除置为0。
语法格式:bool session_destory(),销毁session成功后返回true,否则返回false。

4.3 session 图书上传信息添加和修改例子

addBook.php,添加书籍信息页面:


<form action="toAddBook.php" method="post" >
    作者:<input type="text" name="author" placeholder="请输入文章作者"><br>
    标题:<input type="text" name="title" placeholder="请输入文章标题"><br>
    类型:<select name="bookType">
        <option value="--------请选择类型--------" disabled selected></option>
        <option value="文学类">文学类</option>
        <option value="科普类">科普类</option>
        <option value="教辅类">教辅类</option>
    </select><br>
    内容:<textarea name="content"></textarea><br>
    <input type="submit" value="添加图书">
</form>

toAddBook.php,php处理添加图书信息页面:

<?php

// 获取表单上传的文本信息
$author = $_POST['author'];
$title = $_POST['title'];
$bookType = $_POST['bookType'];
$content = $_POST['content'];

//1.启动session
session_start();
// 2.设定session
$_SESSION['author'] = $author;
$_SESSION['title'] = $title;
$_SESSION['bookType'] = $bookType;
$_SESSION['content'] = $content;

// 3.页面重定向到 showBook.php
// 使用header()函数进行重定向
header("location:showBook.php");

showBook.php,显示图书信息页面:

<?php

// 获取session数据

$author = "";
$title = "";
$bookType ="";
$content = "";
// 每个需要session的地方都需要使用session_start();来开启
session_start();
// 用isset函数判断下,不然报错就不好了
if(isset($_SESSION['author'])){
   
    $author = $_SESSION['author'];
}
if(isset($_SESSION['title'])){
   
    $title = $_SESSION['title'];
}
if(isset($_SESSION['bookType'])){
   
    $bookType = $_SESSION['bookType'];
}
if(isset($_SESSION['content'])){
   
    $content = $_SESSION['content'];
}

// 定界符输出
echo <<<div

<p>作者:$author</p>
<p>标题:$title</p>
<p>文章类型:$bookType</p>
<p>文章内容:$content</p>
<p>
    <button οnclick="window.location.href='updateBook.php'">修改图书内容</button>
</p>
div;

updateBook.php,图书更新表单页面:

<?php
    // 获取session数据

    $author = "";
    $title = "";
    $bookType ="";
    $content = "";
    // 每个需要session的地方都需要使用session_start();来开启
    session_start();
    // 用isset函数判断下,不然报错就不好了
    if(isset($_SESSION['author'])){
   
        $author = $_SESSION['author'];
    }
    if(isset($_SESSION['title'])){
   
        $title = $_SESSION['title'];
    }
    if(isset($_SESSION['bookType'])){
   
        $bookType = $_SESSION['bookType'];
    }
    if(isset($_SESSION['content'])){
   
        $content = $_SESSION['content'];
    }

?>
<form action="toUpdateBook.php" method="post" >
    作者:<input type="text" name="author" value="<?php echo $author?>"><br>
标题:<input type="text" name="title" value="<?php  echo $title;?>"><br>
类型:<select name="bookType">
        <option value="--------请选择类型--------" disabled selected></option>
        <?php
            if ("文学类"==$bookType){
   
                echo '<option value="文学类" selected>文学类</option>
                      <option value="科普类">科普类</option>
                      <option value="教辅类">教辅类</option>';
            }
            if ("科普类"==$bookType){
   
                echo '<option value="文学类" >文学类</option>
                      <option value="科普类" selected>科普类</option>
                      <option value="教辅类">教辅类</option>';
            }if ("教辅类"==$bookType){
   
                echo '<option value="文学类" >文学类</option>
                      <option value="科普类">科普类</option>
                      <option value="教辅类" selected>教辅类</option>';
            }
        ?>

    </select><br>
内容:<textarea name="content"><?php echo $content?></textarea><br>
    <input type="submit" value="修改图书">
</form>

toUpdateBook.php,图书更新表单数据处理页面:

<?php
$author = $_POST['author'];
$title = $_POST['title'];
$bookType = $_POST['bookType'];
$content = $_POST['content'];

//1.启动session
session_start();
// 2.设定session
$_SESSION['author'] = $author;
$_SESSION['title'] = $title;
$_SESSION['bookType'] = $bookType;
$_SESSION['content'] = $content;
// 3.页面重定向到 showBook.php
// 使用header()函数进行重定向
header("location:showBook.php");

tip:每个需要session的地方都需要使用session_start();来开启

运行代码,启动服务:

依次抓包,查看session
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行过程中 的 sessionID PHPSESSID=e2l88u5bva8bhl6ikjeuti5pm1

**打开我们的session文件保存的位置,进行查看:

其底层存储方式为author|s:6:"张三";title|s:21:"杀死一只知更鸟";bookType|s:9:"文学类";content|s:2:"77";**

在这里插入图片描述


好啦,这篇笔记就到这里啦!!!

相关文章
|
13天前
|
存储 安全
Cookie会话跟踪的原理
会话跟踪技术包括Cookie和Session。Cookie是客户端技术,首次访问时服务器通过Set-Cookie响应头发送Cookie,浏览器保存并在后续请求中通过Cookie请求头回传,实现会话跟踪。但Cookie易被用户修改或禁用,安全性较低。Session则是服务器端技术,每次会话生成唯一的Session ID,通过Cookie传递给客户端,客户端在后续请求中携带此ID,服务器据此识别会话。Session更安全,但在集群环境中需解决会话共享问题。
29 1
|
3月前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
4月前
|
数据安全/隐私保护
在某网站的登录页面登录时如果选择“记住用户名”,登录成功后会跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页面中存在一个超链接,单击超链接可以链接到第三个页面查看信息。若选择“
该博客文章通过示例代码和运行结果截图,展示了网站登录过程中如何通过中间层页面使用cookies技术实现“记住用户名”功能,并在点击超链接后查看保存的用户名和密码信息。
在某网站的登录页面登录时如果选择“记住用户名”,登录成功后会跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页面中存在一个超链接,单击超链接可以链接到第三个页面查看信息。若选择“
|
4月前
|
存储 C#
【Azure APIM】APIM 策略语句如何读取请求头中所携带的Cookie信息并保存为变量
【Azure APIM】APIM 策略语句如何读取请求头中所携带的Cookie信息并保存为变量
|
4月前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
76 1
|
4月前
|
数据安全/隐私保护
|
4月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
290 0
|
6月前
|
存储 安全 网络协议
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
|
6月前
|
存储 安全 关系型数据库
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
|
1月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
60 4