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

JEE6 JAX RS: Passing State between @GET & @POST methods :: recommended approach

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

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

URL 类似于:-

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

提交数据输入表单后,当 HTML5 表单首次显示给用户。

例如我需要访问 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";

}

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

我担心负载过重(或任何负载!)会话得到 "mixed up" 或 "miss handled" 不相关的 GET 和 POSTs getting/setting "wrong" 查询参数.

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

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

  1. 客户端 A 使用参数 X 获取页面
    • 会话 A 包含 X
  2. 来自页面参数 X
  3. 的客户端 A POSTs
  4. 客户端 A 使用参数 Y 获取页面 - 在服务器有时间处理来自步骤 2 的请求之前
    • 会话 A 包含 Y
  5. 服务器从第2步开始处理请求;它将使用 错误的 .
  6. Y 参数

这种情况在您的系统中可能可行也可能不可行,但它是一个可能会搞砸的例子。

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