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

JSP 中非表單請求 Action 的三種方式:超鏈接、Struts 標簽、JavaScript 詳解

     編輯:關於JSP

場景

頁面需觸發後端 Action,但不提交表單數據:如「刪除」、「狀態切換」、「導出」、「頁面跳轉」等純導航/命令操作。

方式一:原生超鏈接(最簡單、RESTful)

<a href="userAction.do?action=delete&id=1001">刪除</a>
<a href="orderAction.do?method=export&format=excel">導出 Excel</a>

優點:語義清晰、可被搜索引擎抓取、支持瀏覽器歷史/收藏夾、無 JS 依賴。
缺點:參數暴露在 URL,不適合敏感數據;長 URL 受限(~2KB)。

方式二:Struts 2 URL 標簽生成鏈接(框架集成、自動編碼)

<%@ taglib prefix="s" uri="/struts-tags" %>

<!-- 生成帶參數的 URL -->
<s:url action="userAction" var="deleteUrl">
    <s:param name="action" value="delete" />
    <s:param name="id" value="%{userId}" />
</s:url>
<a href="<s:property value='#deleteUrl' />">刪除</a>

<!-- 直接在標簽中使用 -->
<a href="<s:url action='orderAction'><s:param name='method' value='export'/><s:param name='format' value='excel'/></s:url>">導出</a>

優點:

  • 自動處理 contextPath、參數 URL 編碼、Session ID 重寫(無 Cookie 時)。
  • 支持 includeParams="get/none/all" 繼承當前請求參數。
  • 與 Struts 2 攔截器、結果類型無縫配合。

方式三:JavaScript 動態跳轉(條件判斷、確認框、AJAX 後跳轉)

// 1. 簡單跳轉
function goDelete(id) {
    if (confirm('確定刪除?')) {
        location.href = 'userAction.do?action=delete&id=' + encodeURIComponent(id);
    }
}

// 2. AJAX 校驗後跳轉
function exportData() {
    fetch('/api/export/check', { method: 'POST', body: JSON.stringify({ format: 'excel' }) })
        .then(r => r.json())
        .then(data => {
            if (data.allowed) {
                location.href = data.downloadUrl; // 後端生成臨時下載鏈接
            } else {
                alert(data.message);
            }
        });
}

// 3. POST 方式跳轉(參數不露 URL、超長參數)
function postRedirect(url, params) {
    var form = document.createElement('form');
    form.method = 'POST';
    form.action = url;
    Object.entries(params).forEach(([k, v]) => {
        var input = document.createElement('input');
        input.type = 'hidden';
        input.name = k;
        input.value = v;
        form.appendChild(input);
    });
    document.body.appendChild(form);
    form.submit();
}

// 用法
postRedirect('reportAction.do', { method: 'generate', filters: JSON.stringify(complexFilter) });

對比選型指南

場景推薦方式理由
簡單導航、刪除、詳情頁超鏈接 <a>語義化、SEO、無障礙、緩存友好
需框架自動編碼、攜帶上下文參數Struts <s:url>國際化、無 Cookie 環境、參數復用
需用戶確認、條件判斷、AJAX 前置JavaScript交互豐富、可控流程
敏感參數、大數據量、非冪等操作JS 動態 POST Form參數不入 URL、突破長度限制、防 CSRF 配合 Token

安全最佳實踐

  1. 冪等操作用 GET:查詢、詳情、導出(冪等)。
  2. 非冪等用 POST:刪除、狀態變更、下單——且必須攜帶 CSRF Token。
  3. 參數編碼:JS 中用 encodeURIComponent(),Struts 標簽自動編碼。
  4. 權限校驗在後端:前端隱藏/禁用按鈕僅是 UX,真正授權在 Action/攔截器中驗證。

總結

非表單請求 Action 的本質是導航與命令分離。優先使用語義化的 <a>,框架項目用 <s:url> 保證 URL 生成一致性,複雜交互交給 JavaScript。牢記:URL 參數不可信,權限在服務端。

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