【问题标题】:JSP Forward sends the request to the forwarderJSP Forward 向转发器发送请求
【发布时间】:2012-04-05 03:05:01
【问题描述】:

我有一个 .jsp 文件,它接收请求并检查请求的参数。在与此 JSP 文件相同的目录中,有一个 error.jsp 文件应该进行错误处理。如果参数为空,我想将请求转发到 error.jsp 文件,如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>

<html>
  <head></head>
<body></body>
<% 
request.setCharacterEncoding("UTF-8");
String uid = request.getParameter("uid");
String procName = request.getParameter("procName");
//param check
if(uid == null || procName == null){ %>
<jsp:forward page="error.jsp"/> 
<% }%>
</html>

但是,这不起作用。在转发行之后,我将请求重新提交到同一个 JSP 而不是 error.jsp。最终,由于服务器上的循环,我得到了 StackOverflowException。

如果不是 JSP:forward,我使用 response.sendRedirect(),如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
<html>
<head></head>
<body></body>
<% 
request.setCharacterEncoding("UTF-8");
String uid = request.getParameter("uid");
String procName = request.getParameter("procName");

//param check
if(uid == null || procName == null){
response.sendRedirect("error.jsp");
}%>
</html>

一切正常。为什么 jsp:forward 无法工作?根据this siteAPI 我有正确的标签。

PS.:JSP 部署在 4.0.5 GA 版本的 JBoss AS 中。

【问题讨论】:

  • 您真的不应该在 JSP 中执行此逻辑,而应在 servlet 中执行。 JSP 用于呈现视图,而不是确定控制流。如果您针对问题使用适当的技术,您会发现它更容易预测。
  • @skaffman 我知道;这不是 JSP 正在做的唯一事情。如果参数正确,则在检查后会显示一个表单。我把代码剪短了。
  • 这不是重点。您的 JSP 不应该接收请求并确定控制流,它应该呈现表单。如果原始请求出错,则 servlet 应转发到 error.jsp
  • @skaffman 指出。这是因为 .jsp 可以通过浏览器访问,并且我正在尝试检测错误的访问。否则,JSP 的唯一责任就是呈现表单。谢谢。
  • 请发布StackOverflowError 堆栈跟踪的相关部分,以便我们至少可以确定它在哪里重复。还请说明您是否在 web.xml 中映射了任何 servlet/过滤器,如果有,说明哪些 URL 模式以及它们都在做什么。

标签: jsp jsp-tags


【解决方案1】:

阅读StackOverflowError 的stacktrace 并注意重复模式。检查是否没有任何自定义Filter 被重复拦截转发的请求,并相应地修复Filter 的代码或配置,使其不再这样做。例如,从配置中删除&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; 或设置一些请求属性,表明Filter 已经完成了这项工作。

最后但同样重要的是,您实际上不应该使用 JSP 文件作为前端控制器,而是使用 servlet。对于新的见解,您可能会发现 our servlets wiki page 中的示例很有帮助。它还涵盖了基本的验证和错误处理。

【讨论】:

  • 谢谢!我试图自己保护 JSP,只有 this 就足够了。对于遇到类似问题的其他人,StackOverflow 上有一个question 以确保安全。
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 2011-07-14
  • 2015-04-29
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
相关资源
最近更新 更多