在Adobe Experience Manager中註冊Sling Servlets
在Adobe Experience Manager (AEM) 中,Sling servlet可以被用來處理某些RESTful的請求-回應的AJAX調用。寫在Java編程語言中的Servlets可以被註冊為OSGi(開放服務網關協議)服務。在AEM中註冊servlet有兩種方法:1) 通過路徑,和 2) 通過資源類型。以下是兩種方法的詳細說明:
1. 通過路徑註冊
例如,如果您希望從客戶端發送一個表單POST請求到路徑/bin/payment
到Sling servlet類,您可以使用以下的註解:
@SlingServlet(
metatype = true,
methods = { "POST" },
paths = "/bin/payment"
)
public class YourServlet extends SlingSafeMethodsServlet {
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException {
// 在這裡執行你的任務
}
}
當有一個POST請求到 http://localhost:4502/bin/payment
時,servlet將被觸發,並調用 doPost
方法。
前提條件包括在端口4502上運行本地AEM實例,並通過Maven Bundle插件安裝bundle模組。您可以通過導航到 http://localhost:4502/system/console/bundles
來驗證bundle的安裝。如果沒有安裝,您可以手動上傳JAR文件。
如果您遭遇“禁止”的錯誤,無法服務 /bin/payment
的請求,請按照以下步驟操作:
- 轉到
http://localhost:4502/system/console/configMgr
。 - 搜索 ‘Apache Sling Referrer Filter’。
- 從篩選器中刪除POST方法。這將允許您從任何來源觸發POST方法。
- 搜索Adobe Granite CSRF Filter。
- 從篩選方法中刪除POST。
- 保存更改並再次測試servlet。
Servlet現在應該按預期觸發。
2. 通過資源類型註冊
為了避免上述問題,更好的方法是通過資源類型註冊servlet。重構servlet如下:
@SlingServlet(
metatype = true,
methods = { "POST" },
resourceTypes = "services/payment"
)
public class YourServlet extends SlingSafeMethodsServlet {
@Override
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException {
// 在這裡執行你的任務
}
}
接下來,您需要創建一個頁面來觸發此資源:
- 轉到
http://localhost:4502/crx/de/index.jsp
的CRXDE Lite。 - 在
/content
資料夾內,創建一個頁面(例如,http://localhost:4502/content/submitPage.html
)。 - 在resourceType屬性中,輸入
services/payment
或其他匹配您上述的servlet。 - 保存更改並測試POST請求到
http://localhost:4502/content/submitPage.html
。 應該可以按预期工作。
額外提示: 您也可以使用Apache Sling Resource Resolver來驗證servlet是否已成功註冊在http://localhost:4502/system/console/jcrresolver
。
如果有任何問題,可以在下面的評論中留言。