我正在开发JEE6 JAX RS Web应用程序。
我的应用程序的初始HTML5页面传递了许多查询参数。 这个初始的HTML5页面是一个数据输入表单。
网址类似于: -
http://host:8080/AAA/bbb/ccc?paramOne=1¶mTwo=XYZ¶mThree=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;查询参数。
答案 0 :(得分:2)
会话不会正常混合。混合会话将需要来自服务器实现(不太可能)或您的代码的严重错误(如果您坚持服务器实现会话,则不太可能再次)。只要客户端发回会话cookie,服务器没有重启(或者服务器以某种方式配置为持久化会话)并且会话没有超时,它们就不会丢失。
但是,请求的异步性质理论上可能导致以下情况:
这种情况在你的系统中可能是可行的,也可能是不可行的,但是事情可能会搞乱。
由于您使用的是JAX-RS,我可以假设客户端功能相当强大。我的建议是(如果可能的话)让客户端管理应用程序的状态并让服务器无状态地服务。这意味着来自GET请求的状态(即paramOne=1¶mTwo=XYZ¶mThree=911
)保留在客户端中,重新发送与POST一起,以便服务器在单个请求中具有完整的数据。