開發 JSP 和 Servlet 雖然容易,但安全性問題往往令人頭痛。傳統做法是在程式碼中硬編碼大量安全邏輯,導致程式不靈活、難以維護。本文將示範一種無需修改任何 Java 代碼或 JSP 頁面,僅透過配置 web.xml 即可實現應用程式安全防護的完整方案,並附上實戰範例說明。
Java EE 容器提供了強大的宣告式安全機制,允許開發者在部署描述檔 web.xml 中定義安全約束、驗證方式與資料傳輸保護。本範例結合基本認證(BASIC Auth)與 SSL 加密傳輸,保護 WAR 檔案內的所有資源。
<security-constraint>首先建立一個 <security-constraint> 標籤,鎖定需受保護的 URL 模式與 HTTP 方法。若欲套用至所有 HTTP 方法,只需省略 <http-method> 標籤即可。
<user-data-constraint>為防止帳號密碼以明文傳輸,必須配置 <user-data-constraint> 並將其子標籤 <transport-guarantee> 設為 CONFIDENTIAL,強制容器使用 HTTPS 連線。
<login-config>採用基本認證(BASIC),在 <auth-method> 中指定 BASIC,並定義 <realm-name>。同時需宣告 <security-role> 以對應角色名稱(如 ttrole)。
<security-constraint>
<web-resource-collection>
<web-resource-name>Servlet Application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>ttrole</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
<security-role>
<role-name>ttrole</role-name>
</security-role>
Java EE 容器識別的是邏輯角色,而作業系統管理的是實體使用者/群組。需在應用伺服器專用描述檔(如 Sun/Oracle GlassFish 的 sun-application.xml)中定義 <security-role-mapping>,將角色對應至實際帳號或群組:
<sun-application>
<security-role-mapping>
<role-name>ttrole</role-name>
<group-name>ttgroup</group-name>
</security-role-mapping>
</sun-application>
webann 專案。<appserv_install_dir>/bin/asadmin start-domain domain1。透過純配置方式實現安全防護,不僅消除程式碼耦合,更符合關注點分離原則,大幅降低維護成本。此方案適用於所有符合 Java EE 標準的應用伺服器。