web-dev-qa-db-fra.com

Transmettre les paramètres cachés en utilisant response.sendRedirect ()

Comment pourrais-je passer des paramètres cachés? Je souhaite appeler une page (test.jsp) mais aussi transmettre 2 paramètres cachés, comme un message.

response.sendRedirect("/content/test.jsp");
25
Ashish Anand

La réponse de The NewIdiot explique avec succès le problème et la raison pour laquelle vous ne pouvez pas envoyer d'attributs dans une requête via une redirection. Solutions possibles:

  1. Utiliser le transfert. Cela permettra aux attributs de requête d'être transmis à la vue et vous pouvez les utiliser sous la forme de ServletRequest#getAttribute ou en utilisant Langage d'expression et JSTL . Petit exemple (réutilisation du code de réponse de TheNewIdiot]).

    Controller (votre servlet)

    request.setAttribute("message", "Hello world");
    RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
    

    Voir (votre JSP)

    Utilisation de scriptlets:

    <%
        out.println(request.getAttribute("message"));
    %>
    

    Ceci est juste à des fins de information. L'utilisation des scriptlets doit être évitée: Comment éviter le code Java dans les fichiers JSP? . Ci-dessous, l'exemple utilisant EL et JSTL.

    <c:out value="${message}" />
    
  2. Si vous ne pouvez pas utiliser le transfert (parce que vous ne l'aimez pas ou que vous ne le sentez pas de cette façon ou parce que vous devez utiliser une redirection), une option serait d'enregistrer un message en tant qu'attribut de session, puis redirigez vers votre vue , récupérez l’attribut de session dans votre vue et supprimez-le de la session. N'oubliez pas de toujours avoir votre session utilisateur avec uniquement les données pertinentes. Exemple de code

    Manette

    //if request is not from HttpServletRequest, you should do a typecast before
    HttpSession session = request.getSession(false);
    //save message in session
    session.setAttribute("helloWorld", "Hello world");
    response.sendRedirect("/content/test.jsp");
    

    Vue

    Encore une fois, montrant ceci en utilisant des scriptlets et ensuite EL + JSTL:

    <%
        out.println(session.getAttribute("message"));
        session.removeAttribute("message");
    %>
    
    <c:out value="${sessionScope.message}" />
    <c:remove var="message" scope="session" />
    
44
Luiggi Mendoza

En règle générale, vous ne pouvez pas envoyer de requête POST à l'aide de la méthode sendRedirect () . Vous pouvez utiliser RequestDispatcher to forward () request avec des paramètres dans la même application Web, dans le même contexte.

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);

La spécification HTTP stipule que toutes les redirections doivent être sous la forme d'un GET (ou HEAD). Vous pouvez envisager de chiffrer vos paramètres de chaîne de requête si la sécurité pose problème. Vous pouvez également POST atteindre la cible en masquant un formulaire avec la méthode POST et en le soumettant en javascript lorsque la page est chargée.

4
NINCOMPOOP

En utilisant session, j'ai passé avec succès un paramètre (name) du servlet n ° 1 au servlet n ° 2, en utilisant response.sendRedirect dans le servlet n ° 1. Code de servlet n ° 1:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    String name = request.getParameter("name");
    String password = request.getParameter("password");
    ...
    request.getSession().setAttribute("name", name);
    response.sendRedirect("/todo.do");

Dans le servlet n ° 2, vous n'avez pas besoin de récupérer name. C'est déjà connecté à la session. Vous pouvez faire String name = (String) request.getSession().getAttribute("name"); --- mais vous n'en avez pas besoin.

Si le servlet n ° 2 appelle un fichier JSP, vous pouvez afficher name de cette manière sur la page Web JSP:

<h1>Welcome ${name}</h1>

1
Raymond Gan