首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

JS + PHP 實現靜態頁面即時檢測用戶登入狀態:Script 標籤跨域載入方案

     編輯:PHP 綜合知識

將動態頁面靜態化 (生成 HTML) 可大幅降低伺服器負載,但失去了即時判斷用戶登入狀態的能力。本文介紹一種經典的 <script src="login.php"> 跨域載入方案:靜態頁面引入動態 PHP 腳本,PHP 依 Cookie 狀態輸出 document.write() 顯示登入/未登入介面,兼容不支援 AJAX 的舊環境。

架構原理

  1. 靜態頁面 (index.html) 嵌入 <script src="/loginajax.php?fid=xxx"></script>
  2. 瀏覽器請求 loginajax.php,自動攜帶網域 Cookie
  3. PHP 讀取 $_COOKIE['vvg'] 判斷登入狀態
  4. PHP 輸出 JavaScript 程式碼:document.write('...HTML 片段...')
  5. 瀏覽器執行腳本,將登入狀態 UI 寫入靜態頁面指定位置

靜態頁面 index.html

<!DOCTYPE html>
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  <title>靜態頁面即時調用登入狀態</title>
</head>
<body>
  <!-- 登入狀態顯示區域 -->
  <div id="login-status"></div>

  <!-- 載入動態登入檢測腳本 -->
  <script language="javascript" src="/loginajax.php?fid=123"></script>
</body>
</html>

動態腳本 loginajax.php

<?php
header("Content-Type: application/javascript; charset=gb2312");

$fid = isset($_GET['fid']) ? intval($_GET['fid']) : 0;

// 判斷登入 Cookie (假設登入後設定 vvg 與 realname)
if (!isset($_COOKIE['vvg'])) {
    // 未登入:顯示登入表單
?>
document.write('\
  <form action="/login/login.php" method="post">\
    用戶名:<input type="text" name="username" id="username" class="pl_sty1" />\
    密碼:<input type="password" name="password" class="pl_sty1" />\
    <input type="hidden" name="action" value="login" />\
    <input type="hidden" name="fid" value="<?= $fid ?>" />\
    <input type="submit" value="登入" />\
  </form>\
');
<?php
} else {
    // 已登入:顯示用戶名與登出連結
    $realname = isset($_COOKIE['realname']) ? addslashes($_COOKIE['realname']) : '用戶';
?>
document.write('\
  歡迎回來,<strong><?= $realname ?></strong> \
  <a href="/login/login.php?action=logout">退出</a>\
');
<?php
}
?>

關鍵實作細節

項目說明
Content-Type必須設為 application/javascript 或 text/javascript,否則瀏覽器可能不執行
字元編碼靜態頁與動態腳本編碼必須一致 (範例均為 gb2312),否則中文會亂碼
輸出格式所有 HTML 必須以 document.write('...') 輸出,單引號內的換行需用 \ 續行
跳脫處理動態內容 (如用戶名) 必須經 addslashes() 或 json_encode() 處理,防止 JS 語法錯誤
快取控制建議加入 header('Cache-Control: no-cache, must-revalidate') 避免瀏覽器快取舊狀態

優缺點分析

  • 優點: 相容性極佳 (IE6+)、無需 AJAX 支援、實作簡單、靜態頁完全分離
  • 缺點: document.write 會阻塞頁面渲染、難以維護複雜 UI、不利 SEO、無法在 defer/async 模式下正常運作

現代替代方案比較

方案原理優點缺點
Script 標籤 (本文)JS 載入 PHP 輸出 document.write相容性最好、無需 CORS阻塞渲染、維護困難
AJAX + JSONP$.getJSON 跨域請求回調非阻塞、資料與視圖分離需支援 JSONP、舊瀏覽器受限
AJAX + CORS後端設定 Access-Control-Allow-Origin標準化、支援完整 HTTP 動詞IE8/9 需 XDomainRequest
Edge Side Includes (ESI)Nginx/Varnish 邊緣組合片段真正的靜態化、效能最佳需基礎設施支援、配置複雜
Client-side Rendering (Vue/React)前端框架接 API 渲染體驗最好、關注點分離首屏較慢、SEO 需 SSR

遷移建議

若專案仍在使用此方案,建議漸進式遷移至 AJAX + CORS:

  1. 後端新增 Access-Control-Allow-Origin: * (或指定網域)
  2. 前端改用 fetch('/api/user/status', {credentials: 'include'}) 取得 JSON
  3. 以 Vue/Alpine.js 或原生 innerHTML 渲染登入狀態區塊
  4. 保留 <script> 方案作為舊瀏覽器降級備案

此方案雖屬經典老派技術,但在不支援現代前端工具鏈的老舊專案維護中仍具參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved