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¶mTwo=XYZ¶mThree=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,服务器不会重新启动(或者服务器以某种方式配置为保持会话)并且会话不会超时,它们就不会丢失。
但是,请求的异步性质在理论上可能会导致以下情况:
- 客户端 A 使用参数 X 获取页面
- 会话 A 包含 X
- 来自页面参数 X
的客户端 A POSTs
- 客户端 A 使用参数 Y 获取页面 - 在服务器有时间处理来自步骤 2 的请求之前
- 会话 A 包含 Y
- 服务器从第2步开始处理请求;它将使用 错误的 .
Y 参数
这种情况在您的系统中可能可行也可能不可行,但它是一个可能会搞砸的例子。
由于您使用的是 JAX-RS,我可以假设客户端功能相当强大。我的建议是(如果可能的话)让 client 管理应用程序的状态并让服务器无状态地服务。这意味着来自 GET 请求的状态(即 paramOne=1¶mTwo=XYZ¶mThree=911
)保存在客户端中,并且 resent 与 POST,以便服务器具有完整的数据在单个请求中。
我正在开发 JEE6 JAX RS Web 应用程序。
我的应用程序的初始 HTML5 页面传递了一些查询参数。 此初始 HTML5 页面是一个数据输入表单。
URL 类似于:-
http://host:8080/AAA/bbb/ccc?paramOne=1¶mTwo=XYZ¶mThree=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,服务器不会重新启动(或者服务器以某种方式配置为保持会话)并且会话不会超时,它们就不会丢失。
但是,请求的异步性质在理论上可能会导致以下情况:
- 客户端 A 使用参数 X 获取页面
- 会话 A 包含 X
- 来自页面参数 X 的客户端 A POSTs
- 客户端 A 使用参数 Y 获取页面 - 在服务器有时间处理来自步骤 2 的请求之前
- 会话 A 包含 Y
- 服务器从第2步开始处理请求;它将使用 错误的 . Y 参数
这种情况在您的系统中可能可行也可能不可行,但它是一个可能会搞砸的例子。
由于您使用的是 JAX-RS,我可以假设客户端功能相当强大。我的建议是(如果可能的话)让 client 管理应用程序的状态并让服务器无状态地服务。这意味着来自 GET 请求的状态(即 paramOne=1¶mTwo=XYZ¶mThree=911
)保存在客户端中,并且 resent 与 POST,以便服务器具有完整的数据在单个请求中。