Вопрос по redirect, java, rest – Перенаправление на страницу с помощью методов restful?

9

Я создал страницу, на которой пользователю предлагается заполнить некоторые поля формы, и при его отправке форма отправляется в метод Restful, который вы можете увидеть ниже:

@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
}


Как я могу перенаправить пользователя в конце этой функции (скажем, на index.jsp)?

Ваш Ответ

5   ответов
12

addUser () должен вернуть объект ответа

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()

}
9

javax.ws.rs.core.UriBuilder который отображает параметры и другие данные, которые вы хотите сохранить. Тогда используйтеResponse.temporaryRedirect чтобы вернуть перенаправление клиенту и передать ему созданный вами URI.

Я думаю, что мы должны добавить строку кода следующим образом: бросить новое исключение WebApplicationException (Response.teilitaryRedirect (location) .build ()); Matin Kh
Этот класс, который вы представили «UriBuilder» имеет так много нереализованных методов. Нельзя просто создать экземпляр из него. Я использовал & java.net.URI location = new java.net.URI (& quot; ../ index.jsp & quot;); Response.temporaryRedirect (местоположение); & APOS; и до сих пор ничего не происходит. Matin Kh
URI uri = UriBuilder.fromUri (& quot;server:port/path").build();
1

WebApplicationException & quot; для того, чтобы перенаправить запрос. в Джерси (2.4.1) вы должны иметь возможность перенаправить запрос обычным способом сервлета (request.getServletContext (). getRequestDispatcher (). forward () или просто response.sendRedirect ())

Вот как Джерси обрабатывает запрос

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);

ТотmethodHandler ваш класс обслуживания REST,method это функция в этом классе обслуживания.

Шаг к перенаправлению страницы становится смиренным

Get the (request, response) through Jersey injection (@Context HttpServletRequest request, @Context HttpServletResponse response) in class field or function parameter

Call request.getServletContext().getRequestDispatcher() to get the dispatcher for "forward" or use Response.sendRedirect(url)

Как только ваше приложение будет возвращено (только ноль), Джерси попытается обработать результат в & quot; Responder.process (ContainerResponse) & quot ;. На этом шаге он будет использовать ответ для установки статуса (204 нет содержимого для вашего нулевого возврата).

Таким образом, ключевым моментом здесь является то, что вы должны завершить / закрыть объект ответа, прежде чем вернуться из вашей сервисной функции. В противном случае Джерси может перезаписать ваш вывод.

Маленькие советы о том, почему & quot; WebApplicationException & quot; может перезаписать ответ Джерси. Это потому, что org.glassfish.jersey.server.ServerRuntime.mapException () будет использовать & quot; webApplicationException.getResponse () & quot; как результат обратного ответа.

Этот вопрос и для меня, как для начинающего Java-RS, прежде чем я найду вышеупомянутый ответ в течение нескольких часов поиска, изучения исходного кода и отладки. Вот почему я перечисляю свои выводы, чтобы сэкономить время других и избежать неправильного подхода, поскольку раньше я не мог найти 1 очень четкого ответа.
Это не имеет значения. Проблема сейчас давно ушла Matin Kh
4

что нет другого пути, чем то, что я сделал:
Итак, вот мое решение:

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();
    }


Добавив этот блок в мой код, я получил то, что мне было нужно. Надеюсь, это поможет вам.

2

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();
    }
}

Похожие вопросы