web-dev-qa-db-fra.com

Comment définir un en-tête dans une réponse HTTP?

J'ai une servlet A où je mets un en-tête dans la réponse HTTP:

public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String userName=request.getParameter("userName");
    String newUrl = "http://somehost:port/ServletB";

    response.addHeader("REMOTE_USER", userName);

    response.sendRedirect(newUrl);
}

Maintenant, dans une servlet B , j'essaye d'obtenir la valeur d'en-tête qui a été définie dans la servlet A :

public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String userid = request.getHeader("REMOTE_USER");
}


Mais ici, la valeur de serid vient comme null. Veuillez me faire savoir ce qui me manque ici.

14
Another developer

Tout d'abord, vous devez comprendre la nature de

response.sendRedirect(newUrl);

Il donne au client (navigateur) une réponse de code http 302 avec une URL. Le navigateur effectue ensuite une demande GET distincte sur cette URL. Et cette demande n'a aucune connaissance des en-têtes dans la première.

Ainsi, sendRedirect ne fonctionnera pas si vous devez passer un en-tête de Servlet A à Servlet B.

Si vous voulez que ce code fonctionne - utilisez RequestDispatcher dans le servlet A (au lieu de sendRedirect). De plus, il est toujours préférable d'utiliser un chemin relatif.

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
    String userName=request.getParameter("userName");
    String newUrl = "ServletB";
    response.addHeader("REMOTE_USER", userName);
    RequestDispatcher view = request.getRequestDispatcher(newUrl);
    view.forward(request, response);
}

========================

public void doPost(HttpServletRequest request, HttpServletResponse response)
{
    String sss = response.getHeader("REMOTE_USER");
}
10
pubsy

Dans mon contrôleur, j'ai simplement ajouté un paramètre HttpServletResponse et ajouté manuellement les en-têtes, aucun filtre ou interception requis et cela fonctionne très bien:

httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
httpServletResponse.setHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept, X-Auth-Token, X-Csrf-Token, WWW-Authenticate, Authorization");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "false");
httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
3
hd1

Les champs d'en-tête ne sont pas copiés dans les demandes suivantes. Vous devez utiliser un cookie pour cela (méthode addCookie) ou stocker "REMOTE_USER" dans la session (que vous pouvez obtenir avec la méthode getSession).

0
mgorniew