簡體   English   中英

請求Tomis上的Tomcat infinte循環#dward()。 的StackOverflowError

[英]Tomcat infinte loop on requestDispatcher#forward(). StackOverflowError

Tomcat在不斷重復這些行之后給了我StackOverflowError,其中DiceBoardDispatcher是我的HttpServlet,在第34行我調用requestDispatcher#forward()

nl.rickhurkens.rollDice.web.diceBoard.DiceBoardDispatcher.doGet(DiceBoardDispatcher.java:34)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        nl.rickhurkens.rollDice.web.diceBoard.DiceBoardDispatcher.doGet(DiceBoardDispatcher.java:34)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

我想這與我的部署有關,這是我的web.xml的相關部分:

  <servlet-mapping>
    <servlet-name>DiceBoard</servlet-name>
    <url-pattern>/dices/*</url-pattern>
  </servlet-mapping>

  <filter-mapping>
    <filter-name>RollDiceFilter</filter-name>
    <url-pattern>/dices/roll</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>SetSettingsFilter</filter-name>
    <url-pattern>/dices/setup</url-pattern>
  </filter-mapping>

我要做的是讓兩個動作都登陸同一頁面。 我以為我會這樣設置它。 每個操作都通過自己的Filter ,它們都以發送給JSPServlet結束。

我的url- /diceBoard/*映射曾經是/diceBoard/* ,它是web-app中的某個文件夾。 從那里改為/dices/*修復了去url/dices 現在我可以正常訪問該頁面,但是當進入url/dices/roll我會得到無限循環(無論是POST還是GET)。

編輯:我的servlet代碼:

public class DiceBoardDispatcher extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        RequestDispatcher view = request.getRequestDispatcher("diceBoardPage.jsp");
        view.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        RequestDispatcher view = request.getRequestDispatcher("diceBoardPage.jsp");
        view.forward(request, response);
    }
}

和RollDiceFilter:

public class RollDiceFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;
        HttpSession session = req.getSession();

        DiceBoard diceBoard = (DiceBoard)session.getAttribute("diceBoard");
        String[] lockedValues = req.getParameterValues("lock");

        diceBoard.unlockAllDice();
        if (lockedValues != null) {
            for (String value : lockedValues) {
                if (value != null) {
                    try {
                        diceBoard.lockDice(Integer.parseInt(value));
                    } catch (DiceNotInCollectionException e) {
                        // TODO: redirect to error page.
                        e.printStackTrace();
                    }
                }
            }
        }
        diceBoard.getCup().roll();

        chain.doFilter(req, res);
    }

    public void init(FilterConfig fConfig) throws ServletException { }
    public void destroy() { }
}

這是您的錯誤所在的行:

RequestDispatcher view = request.getRequestDispatcher("diceBoardPage.jsp");

根據getRequestDispatcher API ,輸入uri是對於當前servlet上下文的,所以當你在執行servlet時

/dices/roll

...它執行“diceBoardPage.jsp”的調度,實際上是調度到

/dices/diceBoardPage.jsp

什么servlet映射到這個模式? 根據您的部署描述符,以“/ dices / *”開頭的每個URL都映射到DiceBoard IE是同一個servlet。 這是導致StackOverflowError的無限循環。

如果JSP必須停留在內部dices URI,您必須限制其映射的URL模式DiceBoard的servlet。 如果需要,請不要猶豫,添加幾個值:

<servlet-mapping>
    <servlet-name>DiceBoard</servlet-name>
    <url-pattern>/dices/one</url-pattern>
    <url-pattern>/dices/two</url-pattern>
    <url-pattern>/dices/three</url-pattern>
</servlet-mapping>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM