【问题标题】:Best way to transfer data between servlet and jsp?在servlet和jsp之间传输数据的最佳方式?
【发布时间】:2011-08-18 09:11:23
【问题描述】:

第一次尝试:

我在 servlet 中生成数据,然后在 request 中将其设置为属性,并通过调用 requestDispatcher 将该请求发送到 jsp,如下所示:

request.setAttribute("data",data);
request.getRequestDispatcher("/page.jsp").forward(request, response);

现在用jsp访问它并显示数据。

这工作正常,但每次用户刷新页面时,它都会收到一条警报,说您正在重新提交表单并要求确认。这很烦人。

第二次尝试:

将数据放入会话并在jsp页面中访问。这样,由于数据量很大,会话变得非常繁重。

所以我的问题是将数据从 servlet 传递到 jsp 的最佳方式是什么? 这里的数据是对象列表。

【问题讨论】:

标签: jsp servlets


【解决方案1】:

您的第一个解决方案是好的解决方案。使用会话来保存特定于单个请求的数据不是一个好习惯。用户收到确认消息这一事实与数据从 servlet 传递到 JSP 的方式无关。这与他们正在查看和刷新的页面是 POST 请求的结果有关。

使用Redirect after Post (or Post-Redirect-Get) pattern 来避免这个问题。

例如,假设您正在保存一个新产品,并且在保存该产品后(使用 POST 请求),您希望显示该产品的类别页面。它会这样:

  1. 提交“保存产品”表单
  2. 将产品存储在数据库中,并获取其类别 ID (456)
  3. 发送重定向到 URL productCategory?categoryId=456
  4. 用户自动转到上述网址
  5. 从数据库中获取类别 456 的数据
  6. 将此数据放入请求属性中并转发productCategory.jsp页面
  7. 用户看到产品类别页面,其中包含他刚刚保存的新产品。如果他刷新,它会重新显示类别而不进行确认,也不会重新提交“保存产品”表单。

【讨论】:

  • 我可以发送数据而不显示在 url 中吗?也就是说(根据您的示例)将categoryId 发送到productCategory servlet,但不在url 中。因为那时用户可以在浏览器 url 中看到它并可以使用它。那么有什么解决办法吗?
  • 不,您不能重定向和发帖。要隐藏它,您需要在 AJAX 中完成所有这些操作,但这只会给您一种虚假的安全感。任何人都可以右键单击您的页面、查看其源代码、修改并重新提交,即使使用 POST 或 AJAX 请求也是如此。只需确保在服务器端禁止无权查看特定类别的用户访问。您可以加密/解密请求参数,但即便如此,您也应该使受保护的资源真正受到保护。通过默默无闻的安全性不起作用。
  • @Mark:使用请求参数“玩”到底有什么问题?您想阻止特定类别显示给相关用户吗?那么这个问题需要以不同的方式解决(即使使用 POST 仍然是一个问题,因为最终用户也能够“玩” POST 请求的参数!)。
  • @BalusC:是的,我想阻止向用户显示特定类别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2014-01-27
  • 1970-01-01
  • 2018-11-10
相关资源
最近更新 更多