JEE6 JAX RS:在@GET和之间传递状态; @POST方法::推荐方法

时间:2015-04-16 07:05:56

标签: http java-ee jax-rs

我正在开发JEE6 JAX RS Web应用程序。

我的应用程序的初始HTML5页面传递了许多查询参数。 这个初始的HTML5页面是一个数据输入表单。

网址类似于: -

http://host:8080/AAA/bbb/ccc?paramOne=1&paramTwo=XYZ&paramThree=911

提交数据输入表单时,我需要使用@POST方法访问HTML5表单首次显示给用户时在URL上传递的查询参数。

e.g。我需要访问paramOne,paramTwo和paramThree。

目前我使用过

@Context
private HttpServletRequest request;

...

@Path("ccc")
@GET
@Produces(MediaType.TEXT_HTML)
public InputStream displayForm(@QueryParam("paramOne") final int param1, @QueryParam("paramTwo") final String param2, @QueryParam("paramThree") final int param3) {

    final HttpSession session = request.getSession();

    session.setAttribute("paramOne", param1);
    session.setAttribute("paramTwo", param2);
    session.setAttribute("paramThree", param3);

    return servletContext.getResourceAsStream("/myform.html");
}

...

@POST
@Path("/process/form")
public String processForm(final MultivaluedMap<String, String> formData) {

    final HttpSession session = request.getSession();

    System.out.println("POSTED >" + session.getAttribute("paramOne"));
    System.out.println("POSTED >" + session.getAttribute("paramTwo"));
    System.out.println("POSTED >" + session.getAttribute("paramThree"));

    return "TESTING";

}

这种方法可以安全使用吗?

我担心在重负荷(或任何负载!)会话得到&#34;混合&#34;或&#34;未处理&#34;与un相关的GET和POST获取/设置&#34;错误&#34;查询参数。

1 个答案:

答案 0 :(得分:2)

会话不会正常混合。混合会话将需要来自服务器实现(不太可能)或您的代码的严重错误(如果您坚持服务器实现会话,则不太可能再次)。只要客户端发回会话cookie,服务器没有重启(或者服务器以某种方式配置为持久化会话)并且会话没有超时,它们就不会丢失。

但是,请求的异步性质理论上可能导致以下情况:

  1. 客户A使用参数X获取GET页面
    • 会话A包含X
  2. 客户端A来自参数为X
  3. 的页面的POST
  4. 客户端A在服务器有时间处理来自步骤2的请求之前,使用参数Y - 获取页面
    • 会话A包含Y
  5. 服务器开始处理来自步骤2的请求;它将使用错误参数。
  6. 这种情况在你的系统中可能是可行的,也可能是不可行的,但是事情可能会搞乱。

    由于您使用的是JAX-RS,我可以假设客户端功能相当强大。我的建议是(如果可能的话)让客户端管理应用程序的状态并让服务器无状态地服务。这意味着来自GET请求的状态(即paramOne=1&paramTwo=XYZ&paramThree=911)保留在客户端中,重新发送与POST一起,以便服务器在单个请求中具有完整的数据。