2014-04-01 26 views
4

嗨我正在使用此代碼爲我的CQ5示例應用程序創建Post方法。CQ5:403當調用Post servlet時發生禁止

package com.adobe.cq.sling; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.rmi.ServerException; 
import java.util.Dictionary; 

import org.apache.felix.scr.annotations.Properties; 
import org.apache.felix.scr.annotations.Property; 
import org.apache.felix.scr.annotations.Reference; 
import org.apache.felix.scr.annotations.sling.SlingServlet; 
import org.apache.sling.api.SlingHttpServletRequest; 
import org.apache.sling.api.SlingHttpServletResponse; 
import org.apache.sling.api.servlets.SlingSafeMethodsServlet; 
import org.apache.sling.commons.osgi.OsgiUtil; 
import org.apache.sling.jcr.api.SlingRepository; 
import org.apache.felix.scr.annotations.Reference; 
import org.osgi.service.component.ComponentContext; 
import javax.jcr.Session; 
import javax.jcr.Node; 
import org.json.simple.JSONObject; 
import java.util.UUID; 

@SlingServlet(paths="/bin/mySearchServlet", methods = "POST", metatype=true) 
public class HandleClaim extends org.apache.sling.api.servlets.SlingAllMethodsServlet { 
    private static final long serialVersionUID = 2598426539166789515L; 


    @Override 
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException { 

     try 
     { 
     //Get the submitted form data that is sent from the 
       //CQ web page 
      String id = UUID.randomUUID().toString(); 
      String firstName = request.getParameter("firstName"); 
      String lastName = request.getParameter("lastName"); 
      String address = request.getParameter("address"); 
      String cat = request.getParameter("cat"); 
      String state = request.getParameter("state"); 
      String details = request.getParameter("details"); 
      String date = request.getParameter("date"); 
      String city = request.getParameter("city"); 

      //Encode the submitted form data to JSON 
      JSONObject obj=new JSONObject(); 
      obj.put("id",id); 
      obj.put("firstname",firstName); 
      obj.put("lastname",lastName); 
      obj.put("address",address); 
      obj.put("cat",cat); 
      obj.put("state",state); 
      obj.put("details",details); 
      obj.put("date",date); 
      obj.put("city",city); 

      //Get the JSON formatted data  
      String jsonData = obj.toJSONString(); 

      //Return the JSON formatted data 
     response.getWriter().write(jsonData); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

它可以正常使用GET請求。但對於POST(doPost)請求,我收到了一條消息:403 Forbidden。我應該怎麼做來解決這個問題?

+0

這應該很好地工作的過濾方法。並且它應該在使用GET請求時拋出405 GET不支持的錯誤,因爲你還沒有實現它。對於POST它應該可以工作。你是通過網絡服務器訪問它嗎?如果您通過網絡服務器訪問,您是否檢查過路徑/ bin是否允許訪問? – rakhi4110

+0

你有沒有設法解決這個問題?我有完全相同的問題,似乎無法找出什麼問題 – Chris

回答

7

不會發生此問題,如果您調用從內部客戶端的方法(例如:JSP文件,AJAX或位於應用程序的Servlet)。但是如果從外部客戶端(另一個網站或REST客戶端插件...)CQ安全過濾器將被觸發,以防止你的行動稱之爲然後返回403錯誤刪除此請按照下列步驟操作:

1/http://localhost:4502/system/console/configMgr
2 /搜索「Apache的吊帶引薦過濾器」
3 /從過濾器中取出POST方法。然後你可以在任何地方調用你的POST方法。

+0

我這樣做,但不知何故從引用過濾器中刪除POST不會持久。每次我重新啓動AEM時,它都會重置並在列表中添加POST。任何想法解決它? – Finn

+0

明白了,一個愚蠢的小姐。我使用POST方法刪除了代碼中的配置。有效。 – Finn

5

截至http://sling.apache.org/documentation/the-sling-engine/servlets.html提到的,除非它的路徑被包括在執行路徑使用sling.servlet.paths屬性一個servlet可能被忽略(servletresolver.paths)的SlingServletResolver服務的配置設置。您應該在/system/console/configMgr/org.apache.sling.servlets.resolver.SlingServletResolver處找到該配置。

在你的情況下,我想/ bin/mySearchServlet路徑不包含在該配置參數中,並導致CQ返回403狀態。如果這是正確的,你可以在那裏添加你的路徑(假設你瞭解安全含義),或者在你配置的路徑之一上掛載你的servlet。

請注意,如果可能,最好避免在路徑上安裝servlet,因爲在該文檔頁面上提到了在所需路徑上創建資源的方式。

+0

/斌/將可在默認情況下,解析器的配置是不是?所以,它應該在默認情況下處理這個問題。如果我錯了,請糾正我。順便說一句,我已經檢查了我的實例上的代碼,它沒有任何額外的配置工作正常。 – rakhi4110

+0

天阮沒有說明如果系統有一個默認的配置,所以它的價值檢查。但是你說得對,如果/ bin包含在我提到的servlet應該爲POST請求工作的配置中。 –

2

我也使用相同的代碼的相似的要求,我被卡在這個錯誤。 我已經解決了。

PFB的步驟。他們中的任何一個/所有人都可能爲你工作。

  1. 但是我使用了不同的註釋。

    @Component( 立即=真,元類型= true時,標籤= 「現在搞形式」, 描述= 「現在搞形式」) @Service @Properties({ @Property(NAME =「吊帶。 servlet.paths」,值= { 「/ bin中/ myServlet」}), @Property(名稱= 「sling.servlet.methods」,值= { 「POST」}) })

  2. 我已經給對org.apache.sling.servlets.resolver.SlingServletResolver中的/ bin/myServlet權限。

  3. 使用的海報插件 - 在標題中引用站點設置爲某個HTML站點中現有層次結構其他明智的,它會給403禁止錯誤。另外提及參數發送和去內容發送和說參數的身體。下面的文本框將被填充。現在嘗試發佈數據。

  4. 對於CQ特定的部分: - 我已經實現了基於AJAX的解決方案,其中包含使用AJAX提交點擊發送POST調用的表單。我還有一個包含以下代碼的forward.jsp的自定義操作。

    final ValueMap properties = ResourceUtil.getValueMap(resource); String path = properties.get(「customRedirectPath」,「」); // path =/bin/myServlet FormsHelper.setForwardPath(slingRequest,path); FormsHelper。setRedirectToReferrer(request,true);

我的AJAX調用是: -

argsObject = { 
      oServiceUrl: "/bin/myServlet", 
      oAjaxFormat: "html", 
      oDataForAjax: $thisForm.serialize(), 
      oAjaxCommMethod: "POST", 
      oSuccessCallback: onSubmitSuccessCallback, 
      oErrorCallback: onSubmitErrorCallback 
      } 

我能一旦執行此POST調用來執行我的servlet和期望我收到有效響應。

讓我知道如果這些步驟幫助。

+0

我不認爲POSTER插件使用瀏覽器cookie。這可能會導致禁止的錯誤。嘗試郵遞員 - REST客戶端的Chrome。 – rakhi4110

+0

@ rakhi4110: - 它使用瀏覽器cookies。問題在於我沒有在標題中提到引用此問題的引用者。現在已經解決了。謝謝:) – TechNiks