CQ5: 403 Forbidden se produit lors de l'appel d'un Poste de servlet
Salut, je suis en utilisant ce code pour créer une méthode Post pour mon CQ5 exemple d'application.
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();
}
}
}
il fonctionner avec une requête GET. Mais pour un POSTE(doPost) demande que j'ai reçue un message: 403 Forbidden
. Ce que je dois faire pour résoudre ce problème ?
Cela devrait fonctionner parfaitement. Et il faut jeter une 405 OBTENEZ pas d'erreurs lors de l'utilisation de requête GET, que vous n'avez pas mis en œuvre. Et pour le POSTE, il doit travailler. Êtes-vous accéder à ce par le biais d'un serveur web? Avez-vous vérifié si le chemin d'accès /bin est autorisée dans le cas où vous accédez par l'intermédiaire d'un serveur web?
Avez-vous réussi à résoudre ce problème? J'ai exactement le même problème et n'arrive pas à comprendre ce qu'est la question
Avez-vous réussi à résoudre ce problème? J'ai exactement le même problème et n'arrive pas à comprendre ce qu'est la question
OriginalL'auteur Tien Nguyen | 2014-04-01
Vous devez vous connecter pour publier un commentaire.
Ce problème ne se produira jamais Si vous appelez la méthode de client interne (par exemple: fichier jsp, ajax ou des Servlets qui se trouve dans votre application). Toutefois, si vous appelez ça de la clientèle externe (un autre site web ou un client REST plugin...) CQ filtre de sécurité sera déclenchée pour éviter que votre action puis de retour d'erreur 403 pour supprimer cette s'il vous plaît suivez ces étapes:
1/http://localhost:4502/system/console/configMgr
2/la Recherche pour "Apache Sling Référent Filtre"
3/Supprimer des POSTES méthode du filtre. Ensuite, vous pouvez appeler votre méthode POST n'importe où.
Il a obtenu, une bête de manquer. J'ai vérifié dans ma config dans le code avec la méthode POST supprimé. Il a travaillé.
il vous suffit d'ajouter <cq:includeClientLib catégories="granit.csrf.autonome" /> entre le code html de la balise head. ou utiliser jquery d'aem
OriginalL'auteur Tien Nguyen
Comme mentionné au http://sling.apache.org/documentation/the-sling-engine/servlets.html, une servlet à l'aide de la
sling.servlet.paths
propriété peut être ignorée à moins que son chemin d'accès est inclus dans les Chemins d'Exécution (servletresolver.paths
) paramètre de configuration de la SlingServletResolver service. Vous devriez trouver que la configuration à/system/console/configMgr/org.apache.sling.servlets.resolver.SlingServletResolver
.Dans votre cas, je suppose que le /bin/mySearchServlet chemin n'est pas inclus dans le paramètre de configuration et les causes de CQ pour revenir à un état 403. Si c'est vrai que vous pouvez ajouter votre chemin (en supposant que vous comprenez les implications de sécurité) ou monter vos servlets sur l'un des chemins d'accès configuré.
Noter qu'il est préférable d'éviter de montage servlet, sur des chemins, si possible, la création d'une ressource à la trajectoire souhaitée est préféré comme mentionné sur la page de documentation.
Tien Nguyen n'a pas indiqué si le système a une configuration par défaut, de sorte qu'il vaut la peine de vérifier. Mais vous avez raison, si /bin est inclus dans la config que j'ai mentionné la servlet doit travailler pour les requêtes POST.
OriginalL'auteur Bertrand Delacretaz
En plus des autres réponses, Si vous êtes sur AEM 6.1 ce problème peut aussi être causé par une CSRF de Configuration comme expliqué sur ce post.
Réponse courte, vérifier que la méthode POST n'est PAS dans les méthodes de filtrage de la CSRF filtre config
http://localhost:4502/system/console/configMgr/com.adobe.granite.csrf.impl.CSRFFilter
OriginalL'auteur MRodriguez08
Je suis également en utilisant le même code pour un même ensemble d'exigences, et j'ai été bloqué sur cette erreur.
J'ai résolu.
PFB les étapes. L'un d'eux/Tous pourrait fonctionner pour vous aussi.
J'ai cependant utilisé les annotations différemment.
@Composant(
immédiate = true, metatype = true, label = "Engager dès Maintenant la Forme",
description = "Engager dès Maintenant la Forme")
@Service
@Propriétés({
@Property(name = "fronde.servlet.les chemins d'accès", valeur = {"/bin/myServlet"}),
@Property(name = "fronde.servlet.méthodes", valeur = {"POST"})
})
J'ai donné la permission à mon /bin/myServlet dans les org.apache.la fronde.les servlets.résolveur.SlingServletResolver.
Utilisé l'affiche plugin - définir le referer dans l'en-tête du code html existant dans votre site hiérarchie autrement, il va donner 403 forbidden erreur. Mentionner également les paramètres pour envoyer et aller au contenu d'envoyer et de dire le corps à partir de paramètres. La zone de texte ci-dessous doit être remplie. Maintenant, essayez de la publication des données.
Pour le CQ partie spécifique :- j'ai mis en place un AJAX basé sur une solution avec des formes où j'envoie le POST appel à l'aide de l'AJAX cliquez sur soumettre. J'ai aussi une action personnalisée en place à l'avant d'une.jsp contenant le code suivant.
final ValueMap propriétés = ResourceUtil.getValueMap(ressource);
String path = propriétés.get("customRedirectPath", "");
//path = /bin/myServlet
FormsHelper.setForwardPath(slingRequest, chemin);
FormsHelper.setRedirectToReferrer(demande, true);
Mon appel AJAX est :-
Je suis en mesure d'exécuter mon servlet une fois ce POST appel est exécuté et j'obtiens une réponse valide comme souhaité.
Laissez-moi savoir si ces mesures d'aide.
Il utilise les cookies du navigateur. Le problème était que je n'étais pas mentionner le referer dans l'en-tête qui a été à l'origine de ce problème. Il a maintenant été résolu. Merci 🙂
OriginalL'auteur TechNiks