gpt4 book ai didi

servlets - 在 Java Servlet 中转发请求时出现无限循环

转载 作者:行者123 更新时间:2023-12-02 22:17:35 24 4
gpt4 key购买 nike

我希望你能帮助我解决我面临的这个问题:

我使用 NetBeans 创建了一个简单的 Web 应用程序。到目前为止,这是非常基础的。

  1. Servlet 接收 /verificon/* 上的请求网址模式。
  2. 它提取 /verificon/ 之后设置的任何字符串。 ,即如果 url 为 http://domain/context/verificon/blahblah ,它提取blahblah .
  3. 它检查该字符串是否是已知字符串,并简单地显示带有结果(true/false)的 jsp。

但是,尽管很简单,但在使用测试字符串运行应用程序时出现以下错误:

javax.servlet.ServletException: 
The server side component of the HTTP Monitor has detected a java.lang.StackOverflowError.
This happens when there is an infinite loop in the web module.
Correct the cause of the infinite loop before running the web module again.

org.netbeans.modules.web.monitor.server.MonitorFilter.rethrow(MonitorFilter.java:1648)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:473)
mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51)
mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51)
mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51)
mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70)
...

然后它就不断重复。

我的servlet的processRequest方法如下。 TestData只是一个返回 Mapeo 的辅助类。如果字符串已知或 null 则为对象如果不是。

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");

String h = request.getRequestURI().replaceFirst(request.getContextPath() + "/verificon/", "");

TestData td = TestData.getInstance();

Mapeo m = td.getMapeo(h);

boolean valido = false;
if(m != null) {
valido = true;
}

request.setAttribute("valido", valido);

/*
PrintWriter out = response.getWriter();
out.write("Válido?: " + valido);
out.close();
*/

String respuesta = "WEB-INF/jsp/resultado.jsp";
// Como regla general, forward se utiliza para los GET y sendRedirect para los POST
RequestDispatcher rd = request.getRequestDispatcher(respuesta);
rd.forward(request, response);

}

非常感谢任何帮助。

如果您需要了解任何其他信息,请告诉我。

谢谢!

注释 1:servlet 的第 51 行是 processRequest 方法末尾对 rd.forward() 的调用,第 70 行只是 doGet 方法中对 processRequest() 的调用。注 2:如果我注释前向部分并取消注释 PrintWriter 部分,一切都会按预期进行。注 3:resultado.jsp 是一个纯 HTML 页面,具有正确的 doctype def、html、head 和 body 标记,如下所示: <%boolean valido = (boolean)request.getAttribute("valido");%>
...
<% if(valido) {%>
<p>Válido</p>
<% } else {%>
<p>Inválido</p>
<% }%>

最佳答案

看这里,

String respuesta = "WEB-INF/jsp/resultado.jsp";
RequestDispatcher rd = request.getRequestDispatcher(respuesta);
// ...

您正在使用相对路径进行转发。它转发到再次与 servlet 匹配的 http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp。它依次使用与 http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp/WEB-INF/jsp/resultado.jsp 匹配的相对路径进行转发再次调用servlet。等等。如果您已调试/记录传入请求 URI,一切都会变得更加清晰。

您需要使用绝对路径进行转发。前缀为 /

String respuesta = "/WEB-INF/jsp/resultado.jsp";
// ...
<小时/>

与具体问题无关,在 JSP 中检查值的方式非常笨拙和老派。只需使用 EL (它已经存在十多年了,请确保您正在阅读正确的 JSP/Servlet 书籍/教程):

<p>${valido ? 'Válido' : 'Inválido'}</p>

关于servlets - 在 Java Servlet 中转发请求时出现无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7265049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com