在WebLogic 11g上将请求分派给JspServlet的无限循环

时间:2011-11-22 17:02:15

标签: jsp servlets weblogic

我有以下配置:

ServletA (在我的情况下是Apache CXFserlet - 但这并不重要),它匹配所有请求 - / *。 ServletB ,它正在调度到命名的servlet - 如果可用,则为“jsp”,否则为“JspServlet”。

配置

ServletA ,以便它转发到 ServletB 所有JSP请求。这是完美的。

另一方面, ServletB 正在向“org.apache.jasper.servlet.JSPServlet”转发,如果应用程序在Tomcat上运行,或者向“weblogic.servlet.JSPServlet”运行,如果我是使用Oracle Weblogic。

Tomcat上的一切都很完美。

在Weblogic上,我遇到以下问题: ServletA 转发到 ServletB ,转发到weblogic.servlet.JSPServlet。 JSPServlet应该为JSP提供服务,但事实并非如此。而不是这个,我进入一个无限循环( ServletA - > ServletB - > JSPServlet - > ServletA - > ...

有没有人知道weblogic.servlet.JSPServlet内部发生了什么,并且知道如何让Weblogic为我的JSP提供服务?欢迎所有的想法和建议......我已经在这个问题上投入了太多时间而没有任何成功。

注意:

  • 在Weblogic 10.3.5上测试;
  • 如果 ServletB 转发到虚拟servlet,则不会发生循环;
  • 使用RequestDispatcher完成转发,通过调用Tomcat的getNamedDispatcher(“jsp”)或WebLogic的getNamedDispatcher(“JspServlet”)来检索。

1 个答案:

答案 0 :(得分:1)

我认为它是新的Servlet 2.5规范,Weblogic在URL映射时严格执行这些规范。

  • 仅包含/(正斜杠)字符的servlet路径字符串表示应用程序的默认servlet。 servlet路径解析为请求URI减去上下文路径;在这种情况下,路径解析为null。
  • *(星号)开头的字符串指定扩展名映射。

这些更改通过以下HttpServletRequest方法引入了行为更改:

  • getPathInfo
  • getServletPath

为了更好地说明行为的变化,请考虑解析为ServletA的请求/abc/def.html

  • 如果/映射到ServletA,则servletPath="abc/def.html"pathInfo=null
  • 如果/*映射到ServletA,则servletPath=""pathInfo="abc/def.html"

要确保返回的路径信息为非null,请将所有出现的/(正斜杠)servlet映射字符串替换为/*