【问题标题】:The server encountered an unexpected condition that prevented it from fulfilling the request. HTTP 500服务器遇到了阻止它完成请求的意外情况。 HTTP 500
【发布时间】:2019-06-10 14:42:46
【问题描述】:

我想为多个页面使用一个 servlet。当我尝试运行该项目时,由于请求已满而发生错误。尝试了许多 URL 模式的选项,但没有任何结果

现在,我只看到一种方法。只使用 post 方法并且有空的 url 模式,但我不确定这是正确的选择:D

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <display-name>Archetype Created Web Application</display-name>

  <session-config>
    <session-timeout>10</session-timeout>
  </session-config>

  <filter>
    <filter-name>InitialFilter</filter-name>
    <filter-class>eshop.filter.InitialFilter</filter-class>

    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>

  </filter>

  <filter>
  <filter-name>SessionFilter</filter-name>
  <filter-class>eshop.filter.SessionFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>InitialFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>mainServlet</servlet-name>
    <servlet-class>eshop.controller.MainServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>mainServlet</servlet-name>
    <url-pattern>*.jsp</url-pattern>
  </servlet-mapping>

    <error-page>
        <location>/WEB-INF/views/error.jsp</location>
    </error-page>

</web-app>
    public class IndexCommand implements Command {

        @Override
        public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, MessagingException, ServiceException, SQLException {
            if (request.getSession().getAttribute("role")=="admin")
            {
                Command command=new AccountCommand();
                command.execute(request,response);
            }
            System.out.println(request.getRequestURI());
            request.getRequestDispatcher("/WEB-INF/views/startPage.jsp").forward(request,response);
        }

    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Command command = CommandFactory.createCommand(request);
            try {
                command.execute(request, response);
            } catch (MessagingException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (ServiceException e) {
                e.printStackTrace();
            }

        }
    Type Exception Report

    Message Servlet execution threw an exception

    Description The server encountered an unexpected condition that prevented it from fulfilling the request.

    Exception

    javax.servlet.ServletException: Servlet execution threw an exception
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        eshop.command.IndexCommand.execute(IndexCommand.java:34)
        eshop.controller.MainServlet.doGet(MainServlet.java:62)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        eshop.command.IndexCommand.execute(IndexCommand.java:34)
        eshop.controller.MainServlet.doGet(MainServlet.java:62)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    Root Cause

    java.lang.StackOverflowError
        eshop.command.IndexCommand.execute(IndexCommand.java:34)
        eshop.controller.MainServlet.doGet(MainServlet.java:62)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

如何配置 web.xml 以将一个 servlet 映射到 Java 中的多个 url 模式,问题出在哪里?

【问题讨论】:

  • 问题是您将请求转发给调度程序,调度程序再次通过过滤器等等。
  • @PiotrWilkin 但我该如何解决呢?我不知道消除此错误的一些方法

标签: java servlets filter request url-pattern


【解决方案1】:

您可以为 servlet 放置任意数量的映射,但您可以将它们作为单独的 servlet 映射元素放置。

 <servlet-mapping>
    <servlet-name>mainServlet</servlet-name>
    <url-pattern>*.jsp</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>mainServlet</servlet-name>
    <url-pattern>*.jsp</url-pattern>
  </servlet-mapping>

关于第二个问题,您会得到无限循环,因为 JEE 过滤器也会在通过 RequestDispatcher 到您的 JSP 页面的内部调度中触发。因此,当您尝试分派到您的 JSP 时,您再次点击了过滤器链中的第一个过滤器,在这里您将获得无限循环。因此,您可以指定您的过滤器仅适用于外部请求。

<filter-mapping>
  <filter-name>RequestLoggingFilter</filter-name> <!-- mandatory -->
  <url-pattern>/*</url-pattern>
  <servlet-name>XXXXXXXXXXXXXXXXX</servlet-name>
  <dispatcher>REQUEST</dispatcher>
</filter-mapping>

检查您的 WsFilter,它是导致问题的原因,因为似乎所有过滤器都是在 /* 上触发的。如果您发布完整的 web.xml 以便我知道出现的顺序,我可以为您提供更多帮助。

您阅读 Oracle 过滤请求的教程,这是最好的教程。

https://docs.oracle.com/javaee/5/tutorial/doc/bnagb.html

我认为将逻辑放入过滤器不是一个好主意。好的设计是将逻辑放入 servlet。

【讨论】:

  • 谢谢第一次!我在顶部添加了完整的 web.xml
  • 这个过滤器如何进入你的代码:org.apache.tomcat.websocket.server.WsFilter?你的过滤器是从它延伸出来的吗?
  • 不。 InitialFilter 和 SessionFilter 只是实现了 Filter
  • 试图找到这个过滤器。他在我的项目中不存在。天哪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多