Passez les paramètres cachés en utilisant la réponse.sendRedirect()

Comment passer des paramètres cachés? Je veux appeler une page (page de test.jsp) mais aussi passer 2 paramètres cachés comme un piquet.

response.sendRedirect("/content/test.jsp");
25
demandé sur NINCOMPOOP 2013-06-08 19:47:26

3 réponses

Thenewidiot's answer explique avec succès le problème et la raison pour laquelle vous ne pouvez pas envoyer d'attributs dans la requête via une redirection. Solutions possibles:

  1. utilisant l'expédition. Cela permettra que les attributs request puissent être passés à la vue et vous pouvez les utiliser sous la forme de ServletRequest#getAttribute ou en utilisant Expression Language et JSTL . Petit exemple (réutiliser le code de la réponse de TheNewIdiot).

    contrôleur (votre servlet)

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

    en Vue (JSP)

    en Utilisant les scriptlets:

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

    C'est juste pour à des fins d'information . Les Scriptlets utilisation doit être évité : Comment éviter de code Java dans les pages JSP fichiers? . L'exemple ci-dessous utilise EL et JSTL.

    <c:out value="${message}" />
    
  2. si vous ne pouvez pas utiliser le forwarding (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) alors une option serait de sauvegarder un message en tant qu'attribut de session, puis rediriger vers votre vue, récupérer l'attribut de session dans votre vue et le supprimer de session. N'oubliez pas d'avoir toujours votre session utilisateur avec seules les données pertinentes. Exemple de Code

    contrôleur

    //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

    à nouveau, en montrant ceci en utilisant des scriptlets et puis EL + JSTL:

    <%
        out.println(session.getAttribute("message"));
        session.removeAttribute("message");
    %>
    
    <c:out value="${sessionScope.message}" />
    <c:remove var="message" scope="session" />
    
42
répondu Luiggi Mendoza 2017-05-23 11:54:28

en général, vous ne pouvez pas envoyer une demande postale en utilisant la méthode sendRedirect () . Vous pouvez utiliser les requêtes RequestDispatcher à forward() avec des paramètres dans la même application web, 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 D'une HEAD). Vous pouvez chiffrer vos paramètres de chaîne de requête si la sécurité est un problème. Une autre façon est vous pouvez poster vers la cible en ayant un formulaire caché avec la méthode POST et le soumettre avec javascript lorsque la page est chargée.

4
répondu NINCOMPOOP 2013-06-08 16:13:33

en utilisant session , j'ai passé avec succès un paramètre ( name ) de servlet #1 à servlet #2, en utilisant response.sendRedirect dans servlet #1. Code Servlet #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 Servlet #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'avez pas besoin de ça.

si Servlet #2 appelle un JSP, vous pouvez afficher name de cette façon sur la page Web du JSP:

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

1
répondu Raymond Gan 2016-11-27 02:00:00