10

我创建了一个页面,要求用户填写一些表单字段,当他提交时,表单被发送到一个 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?

4

5 回答 5

14

像这样更改您的代码, 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()

}
于 2014-05-07T10:25:40.013 回答
12

javax.ws.rs.core.UriBuilder使用映射您要保留的参数和其他数据的 URI 创建一个 URI 。然后用于Response.temporaryRedirect向客户端返回重定向并将您构建的 URI 传递给它。

于 2012-06-20T09:40:56.337 回答
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();
    }


通过将此块添加到我的代码中,我得到了我需要的东西。希望它也能帮助你。

于 2012-06-28T05:56:03.390 回答
2

请参阅以下 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();
    }
}
于 2015-11-18T10:00:14.417 回答
1

使用“WebApplicationException”来重定向请求不是一个好主意。在 Jersey (2.4.1) 中,您应该能够通过正常的 servlet 方式重定向请求,(request.getServletContext().getRequestDispatcher().forward() 或只是 response.sendRedirect())

以下是 Jersey 处理请求的方式

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 服务类,方法是该服务类中的函数。

重定向页面的步骤变得严格

  1. 通过Jersey注入(@Context HttpServletRequest request,@Context HttpServletResponse response)在类字段或函数参数中获取(request,response)

  2. 调用 request.getServletContext().getRequestDispatcher() 以获取“转发”的调度程序或使用 Response.sendRedirect(url)

一旦您的应用程序被返回(只是 null),Jersey 将尝试在“Responder.process(ContainerResponse)”中处理结果。在这一步中,它将使用响应来设置状态(204 没有内容为您的 null 返回)。

所以这里的关键是你必须在从你的服务函数返回之前完成/关闭响应对象。否则,Jersey 可能会覆盖您的输出。

关于为什么“WebApplicationException”可以覆盖 Jersey 响应的小提示。这是因为 org.glassfish.jersey.server.ServerRuntime.mapException() 将使用“webApplicationException.getResponse()”作为返回响应结果。

于 2013-11-29T11:21:02.313 回答