web-dev-qa-db-fra.com

Redirection vers une page à l'aide de méthodes reposantes?

J'ai créé une page qui demande à l'utilisateur de remplir certains champs du formulaire et lorsqu'il le soumet, le formulaire est envoyé à une méthode Restful que vous pouvez voir ci-dessous:

@POST
@Path("addUser")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void addUser(@FormParam("username") String username,
        @FormParam("password") String password,
        @FormParam("id") String id,
        @FormParam("group_name") String groupName,
        @FormParam("authority_name") String authorityName,
        @FormParam("authority_id") String authorityId
        )
{
    //Something will be done here
}


Comment puis-je rediriger l'utilisateur à la fin de cette fonction vers (disons) index.jsp?

9
Matin Kh

Créez un URI à l'aide de javax.ws.rs.core.UriBuilder qui mappe les paramètres et les autres données que vous souhaitez conserver. Utilisez ensuite Response.temporaryRedirect pour renvoyer une redirection au client et transmettez-lui l'URI que vous avez créé.

9
sergiofbsilva

changez votre code de cette façon, addUser () devrait retourner un objet Response

public Response addUser(@FormParam("username") String username,
        @FormParam("password") String password,
        @FormParam("id") String id,
        @FormParam("group_name") String groupName,
        @FormParam("authority_name") String authorityName,
        @FormParam("authority_id") String authorityId
        )
{
    //Something will be done here

    Java.net.URI location = new Java.net.URI("../index.jsp?msg=A_User_Added");
    return Response.temporaryRedirect(location).build()

}
12
Joey

J'en viens finalement à la conclusion qu'il n'y a pas d'autre moyen que ce que j'ai fait:
Voici donc ma solution:

try {
        Java.net.URI location = new Java.net.URI("../index.jsp?msg=A_User_Added");
        throw new WebApplicationException(Response.temporaryRedirect(location).build());
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }


En ajoutant ce bloc à mon code, j'ai obtenu ce dont j'avais besoin. J'espère que cela vous aidera aussi.

4
Matin Kh

Voir ci-dessous l'utilisation de la redirection dans les services Web:

public class LoginWebService {

    @POST
    @Path("/check")
    public Response checkDetails(@FormParam("name") String name,@FormParam("pass") String pass ) throws URISyntaxException  {

        URI uri = new URI("/login/success");
        URI uri2= new URI("http://localhost:9090/NewWebServiceproject/new/login/failure");

        if(name.equals("admin") && pass.equals("pass"))
    //@Path("http://localhost:8010/NewWebServiceproject/new/login/success");
            {
            return Response.temporaryRedirect(uri).build();
            //Response.seeOther(uri);
            //return Response.status(200).entity("user successfully login").build();
            }
        else
        {
            return Response.temporaryRedirect(uri2).build();
            //Response.seeOther(uri2);
            //return Response.status(200).entity("user logon failed").build();
            }
    }
    @POST
    @Path("/success")
    public Response successpage()
    {
    return Response.status(200).entity("user successfully login").build();
    }
    @POST
    @Path("/failure")
    public Response failurepage()
    {
    return Response.status(200).entity("user logon failed").build();
    }
}
2
Divya Jaiswal

Il n'est pas judicieux d'utiliser "WebApplicationException" afin de rediriger la demande. dans Jersey (2.4.1), vous devriez pouvoir rediriger la demande via la servlet normale (request.getServletContext (). getRequestDispatcher (). forward () ou simplement response.sendRedirect ()).

Voici comment Jersey traite la demande

org.glassfish.jersey.servlet.ServletContainer.service(HttpServletRequest request, HttpServletResponse response)
      requestScope.runInScope
           final ContainerResponse response = endpoint.apply(data)
                  methodHandler.invoke(resource, method, args);
           Responder.process(ContainerResponse);

Ce methodHandler est votre REST classe de service, méthode est la fonction de cette classe de service. 

L'étape pour rediriger la page devient sournoise

  1. Obtenez l'injection (requête, réponse) via Jersey (demande @Context HttpServletRequest, réponse @Context HttpServletResponse) dans le champ ou le paramètre de fonction de la classe

  2. Appelez request.getServletContext (). GetRequestDispatcher () pour obtenir le répartiteur pour "transférer" Ou utilisez Response.sendRedirect (url).

Une fois que votre application est renvoyée (juste null), Jersey essaiera de traiter le résultat dans le fichier "Responder.process (ContainerResponse)". Dans cette étape, il utilisera response pour définir le statut (204 aucun contenu pour votre déclaration NULL). 

Le point clé ici est donc que vous devez finaliser/fermer l’objet de réponse avant de revenir de votre fonction de service. Sinon, Jersey pourrait écraser votre sortie. 

Petits conseils sur les raisons pour lesquelles "WebApplicationException" peut écraser Jersey repsponse. C'est parce que org.glassfish.jersey.server.ServerRuntime.mapException () utilisera "webApplicationException.getResponse ()" comme résultat de la réponse renvoyée. 

1
Shen liang