博客列表 >PHP的cookie 与 session 技术、7天免密登录

PHP的cookie 与 session 技术、7天免密登录

司马青衫
司马青衫原创
2020年07月19日 22:42:041853浏览

PHP cookie 与 session

  • cookie 是存储在本地的数据文本
  • cookie 文本大小不超过 4K 不能存储大量数据
  • cookie 安全性不好 一般不存储敏感信息
  • 使用 setcookie()函数对 cookie 进行操作 其可选属性有:
    • name:cookie 的变量名
    • value:cookie 变量的值
    • expire:cookie 的失效时间 单位是秒
    • path:cookie 在服务器端的有效路径
    • domain:cookie 有效的域名
    • secure:cookie 是否在 https 下有效
  1. <?php
  2. //创建名为username的cookie 其值为root 有效期为浏览器关闭前
  3. setcookie('username', 'root');
  4. //读取cookie
  5. echo $_COOKIE['username'];
  6. //删除cookie
  7. //将cookie的失效时间设置成小于系统的当前时间
  8. setcookie('username', '', 0);

PHP session

  • session 是存储在服务器端的数据文本
  • session 没有存储大小限制
  • 使用 session 一般有以下步骤
    • 启动会话:方法 1.将session_start()写在页面最开始;方法 2.在 php.ini 文件中修改session.auto_start使值为 1.
    • 存储会话:直接使用$_SESSION['var_name'] = 'value'存储名为 var_name 值为 value 的 session 变量
    • 读取会话:$val = $_SESSION['var_name']直接读取 session 中的 var_name 的值
    • 删除会话:
      • 删除单个会话:unset($_SESSION['var_name'])直接注销名为 var_name 的 session 变量
      • 删除多个会话:$_SESSION = array()将空数组赋值给 session 那么 session 中不再有任何数据
      • 结束当前会话:session_destory()将服务器中的 session 文件删除掉
  1. <?php
  2. //启动会话 写在php文本的最前面
  3. // session_start();
  4. //存储会话
  5. $_SESSION['username'] = 'root';
  6. $_SESSION['password'] = 'poot';
  7. //读取会话
  8. $userName = $_SESSION['username'];
  9. echo $userName;
  10. //删除会话
  11. //删除单个会话username
  12. unset($_SESSION['username']);
  13. //删除所有会话
  14. $_SESSION = array();
  15. //结束当前会话
  16. session_destroy();
  • login.php 登录选择页面
    1. <?php
    2. function direct_login(){
    3. setcookie('username', $_COOKIE['username'], time()+604800); //重置7天时间
    4. setcookie('isLogin', 1);
    5. setcookie('isCheck', 1);
    6. header('Location:index.php'); //直接进入主页 免登录
    7. }
    8. function new_account_login(){
    9. setcookie('username', '', 0);
    10. setcookie('isLogin', '', 0);
    11. setcookie('isCheck', '', 0);
    12. header('Location:login_new.php'); //跳转到登录页面
    13. }
    14. //判断本地是否有用户登录过的cookie
    15. if(isset($_COOKIE['username'])){
    16. //选择是否使用新账号登录
    17. if($_POST['old_account']){ //免密直接登录
    18. direct_login();
    19. }else if($_POST['new_account']){ //新账号登录
    20. new_account_login();
    21. }
    22. }else{ //本地没有用户登录过的cookie
    23. new_account_login();
    24. }
    25. //退出登录
    26. if($_GET["action"] == 'quit'){
    27. if(empty($_COOKIE['isCheck'])){ //没有选择7天免登录
    28. new_account_login();
    29. }
    30. }
    31. ?>
    32. <!DOCTYPE html>
    33. <html lang="en">
    34. <head>
    35. <meta charset="UTF-8">
    36. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    37. <title>用户登录</title>
    38. <style>
    39. *{
    40. padding: 0;
    41. margin: 0;
    42. box-sizing: border-box;
    43. }
    44. form{
    45. margin: 60px auto;
    46. max-width: 400px;
    47. height: 110px;
    48. border: 5px solid green;
    49. display: flex;
    50. flex-flow: column nowrap;
    51. align-items: center;
    52. }
    53. form > input{
    54. width: 280px;
    55. height: 40px;
    56. margin: 10px;
    57. background-color: white;
    58. border: 1px solid green;
    59. }
    60. </style>
    61. </head>
    62. <body>
    63. <form action="" method="post" >
    64. <input type='submit' name='old_account' value='使用<?php echo $_COOKIE['username'];?>账号登录' />
    65. <input type='submit' name='new_account' value='使用新账号登录' />
    66. </form>
    67. </body>
    68. </html>
  • login_new.php 新账号登录页面
    1. <?php
    2. if($_POST['sub']){ //用户点击提交 获取用户输入数据
    3. $username = $_POST['username'];
    4. $password = $_POST['password'];
    5. $checked = $_POST['chk'];
    6. if($username == 'root' && $password == 123){ //用户名与密码都正确
    7. if(!empty($checked)){ //勾选了7天免登录
    8. setcookie('username', $username, time()+604800);
    9. }else{ //拒绝7天免登录
    10. setcookie('username', $username);
    11. }
    12. setcookie('isCheck', $checked);
    13. setcookie('isLogin', 1);
    14. header('Location:index.php');
    15. }else{ //用户名或密码错误
    16. echo "<script>alert('用户名或密码错误!');</script>";
    17. }
    18. }
    19. ?>
    20. <!DOCTYPE html>
    21. <html lang="en">
    22. <head>
    23. <meta charset="UTF-8">
    24. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    25. <title>用户登录</title>
    26. <style>
    27. *{
    28. padding: 0;
    29. margin: 0;
    30. box-sizing: border-box;
    31. }
    32. .login{
    33. margin: 60px auto;
    34. max-width: 400px;
    35. height: 250px;
    36. border: 5px solid green;
    37. display: flex;
    38. flex-flow: column nowrap;
    39. }
    40. .login > h1{
    41. font-size: 20px;
    42. margin: 10px;
    43. text-align: center;
    44. }
    45. .login > form{
    46. display: flex;
    47. flex-flow: column nowrap;
    48. align-items: center;
    49. }
    50. .login > form > *{
    51. width: 280px;
    52. height: 40px;
    53. margin: 10px;
    54. }
    55. .login > form > div{
    56. display: flex;
    57. justify-content: space-between;
    58. }
    59. .login > form > div > input{
    60. width: 100px;
    61. background-color: white;
    62. border: 1px solid green;
    63. }
    64. .login > form > div > div{
    65. font-size: 12px;
    66. line-height: 40px;
    67. }
    68. </style>
    69. </head>
    70. <body>
    71. <div class="login">
    72. <h1>用户登录</h1>
    73. <form action="" method="post">
    74. <input type="text" name='username' placeholder="用户名" require>
    75. <input type="password" name='password' placeholder="密码" require>
    76. <div>
    77. <div><input type="checkbox" name='chk' checked>7天自动登录</div>
    78. <input type="submit" name='sub' value='提交'>
    79. </div>
    80. </form>
    81. </div>
    82. </body>
    83. </html>
  • index.php 登录后的页面
    1. <?php
    2. //当用户未通过登录界面进入此页面时 返回登录界面并弹出警告
    3. if(!(isset($_COOKIE['isLogin']) && $_COOKIE['isLogin'] == 1)){
    4. exit('
    5. <script>
    6. alert("重新登录");
    7. location.href="login.php";
    8. </script>
    9. ');
    10. }
    11. ?>
    12. <!DOCTYPE html>
    13. <html lang="en">
    14. <head>
    15. <meta charset="UTF-8">
    16. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    17. <title>首页</title>
    18. <style>
    19. body{
    20. display: flex;
    21. flex-flow: column nowrap;
    22. text-align: center;
    23. }
    24. h1{
    25. margin: 0 auto;
    26. }
    27. </style>
    28. </head>
    29. <body>
    30. <h1>首页</h1>
    31. <p><?php echo '欢迎您:',$_COOKIE['username']; ?></p>
    32. <a href="login.php?action=quit">退出登录</a>
    33. </body>
    34. </html>
  • 登录主界面演示
  • 选择7天自动登录后的界面
  • 不选择7天自动登录后的界面
  • 选择7天自动登录后关闭浏览器 再次进入登录的界面

  • 没有使用cookie保存密码

  • 直接判断cookie中是否存在正确的用户名进行登录
  • 当不选择7天自动登录时 退出登录 删除所有相关的cookie
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
司马青衫2020-07-20 15:12:342楼
好的,谢谢老师
灭绝师太2020-07-20 14:51:321楼
看的出有你自己的思考在里面,在登录界面提供给了用户多一层的选择。也追加了逻辑判断。试着用session再做一遍