在servlet和jsp之间传输数据的最佳方法?
第一次尝试: 我在servlet中生成数据,然后在请求中将其设置为属性,并通过调用requestDispatcher将该请求发送到jsp,如下所示:在servlet和jsp之间传输数据的最佳方法?,jsp,servlets,Jsp,Servlets,第一次尝试: 我在servlet中生成数据,然后在请求中将其设置为属性,并通过调用requestDispatcher将该请求发送到jsp,如下所示: request.setAttribute("data",data); request.getRequestDispatcher("/page.jsp").forward(request, response); 现在在jsp中访问它并显示数据 这可以正常工作,但每次用户刷新页面时,它都会收到一个警报,表示您正在重新提交表单并要求确认。这很烦人 第二
request.setAttribute("data",data);
request.getRequestDispatcher("/page.jsp").forward(request, response);
现在在jsp中访问它并显示数据
这可以正常工作,但每次用户刷新页面时,它都会收到一个警报,表示您正在重新提交表单并要求确认。这很烦人
第二次尝试:
将数据放入会话中,并在jsp页面中访问该数据。这样,由于数据量很大,会话变得非常繁重
所以我的问题是将数据从servlet传递到jsp的最佳方式是什么?
这里的数据是对象列表。您的第一个解决方案是好的。使用会话保存特定于单个请求的数据不是一种好做法。用户收到确认消息的事实与数据从servlet传递到JSP的方式无关。这与他们正在查看和刷新的页面是POST请求的结果有关 使用可避免此问题 例如,假设您正在保存一个新产品,并且在保存该产品后(使用POST请求),您希望显示该产品的类别页面。它将是这样的:
你的第一个解决方案是好的。使用会话保存特定于单个请求的数据不是一种好做法。用户收到确认消息的事实与数据从servlet传递到JSP的方式无关。这与他们正在查看和刷新的页面是POST请求的结果有关 使用可避免此问题 例如,假设您正在保存一个新产品,并且在保存该产品后(使用POST请求),您希望显示该产品的类别页面。它将是这样的:
我可以发送数据而不在url中显示它吗?即(根据您的示例)将
categoryId
发送到productCategory
servlet,但不发送到url中。因为这样用户就可以在浏览器url中看到它,并可以玩它。那么有什么解决办法吗?不,你不能重定向和发帖。要隐藏它,您需要在AJAX中执行所有这些操作,但它只会给您一种错误的安全感。任何人都可以右键单击您的页面,查看其源代码,修改并重新提交,即使使用POST或AJAX请求。只需确保服务器端禁止未经授权查看特定类别的用户访问。您可以对请求参数进行加密/解密,但即使这样,您也应该真正保护受保护的资源。默默无闻的安全性不起作用。@马克:使用请求参数到底有什么问题?是否要阻止特定类别显示给相关用户?然后,这个问题需要以不同的方式解决(即使使用POST,这仍然是一个问题,因为最终用户也可以“玩”POST请求的参数!)。@BalusC:是的,我想阻止特定类别显示给用户。我可以发送数据而不在url中显示它吗?即(根据您的示例)将categoryId
发送到productCategory
servlet,但不发送到url中。因为这样用户就可以在浏览器url中看到它,并可以玩它。那么有什么解决办法吗?不,你不能重定向和发帖。要隐藏它,您需要在AJAX中执行所有这些操作,但它只会给您一种错误的安全感。任何人都可以右键单击您的页面,查看其源代码,修改并重新提交,即使使用POST或AJAX请求。只需确保服务器端禁止未经授权查看特定类别的用户访问。您可以对请求参数进行加密/解密,但即使这样,您也应该真正保护受保护的资源。默默无闻的安全性不起作用。@马克:使用请求参数到底有什么问题?是否要阻止特定类别显示给相关用户?然后,这个问题需要以不同的方式解决(即使使用POST,这仍然是一个问题,因为最终用户也可以“玩”POST请求的参数!)。@BalusC:是的,我想阻止特定类别显示给用户。只需使用GET而不是POST来检索数据。另请参见servlets标记wiki页面仅使用GET而不是POST来检索数据。另请参见servlets标记wiki页面