Servlet中访问路径配置为/*时,使用请求转发造成内存溢出

人生乱弹 2年前 (2023) admin
10 0

一、问题由来
  最近在测试Servlet的请求转发功能,准备抽取一个公共的PageJumpTestServlet,用来做页面跳转功能。
这样不用每次在测试的时候,都单独写一个Servlet用来做页面跳转。自己最初的设想时,在路径配置的
时候使用/toPage/*,访问地址示例http://localhost:8080/javaWeb/toPage/login,修改最后一级路径即可。
然后在doGet()方法中,截取最后一级路径,使用请求转发到指定的页面路径即可,完整代码如下
@WebServlet("/toPage/*")
public class PageJumpTestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String requestURL = req.getRequestURL().toString();
        if(requestURL != null && requestURL.lastIndexOf("/") > 0){
            String pagePath = requestURL.substring(requestURL.lastIndexOf("/"));
            System.out.println("pagePath-->" + "WEB-INF/pages" + pagePath + ".html");
            req.getRequestDispatcher("WEB-INF/pages" + pagePath + ".html").forward(req, resp);
            return;
        }

        // 错误提示信息
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.println("请求路径错误!");
        writer.flush();
    }
}
代码写好之后,自己就开始测试,一测试的时候就出现内存溢出。
如下图所示:
 

 
往后面翻看的时候,发现有内存溢出的问题.
 

 

 
 
这就是一个简单的页面跳转,怎么会出现这个奇怪的问题呢?让自己感到很困惑。然后自己去网上找答案,
使用百度开发者搜索,
 

 
用前面三行错误信息进行搜索,没有找到一圈没有找到自己想要的答案。
 

 
然后使用谷歌搜索。
找到一篇博客和自己遇到的问题非常类似,
提问题的博主同样在Servlet中配置路径时,配置了/*
 

 
并且同样是用来做页面转发,
 

 
和自己的情况非常类似。
好心的网友回答如下
 

 
使用百度翻译过来如下,
 
大致意思就是自己在配置路径时,配置的是/toPage/*,会匹配到所有包含/toPage/请求的路径,
访问地址http://localhost:8082/chapterNine/toPage/jqueryTest  时,Servlet的doGet()方法视图将请求转发到
自己配置的路径中。只是在转发过程中,根据路径的配置,又会被定向到当前的Servlet中,最终造成死循环。
 
自己还做了另外一个测试,把/toPage/*改成/*效果是一模一样的。最终造成内存溢出。问题找到后就好解决了
地址如下:
https://stackoverflow.com/questions/43505168/stackoverflowerror-when-try-to-access-web-application
 
三、解决方案
问题找到之后,就好解决。自己换了一种方式,将请求参数放在get请求的地址栏中,然后在后台动态获取参数,
然后在进行页面跳转。这样在配置访问路径时,就可以配置为精确匹配,很好地解决了这个问题。最终代码如下,
@WebServlet("/toPage")
public class PageJumpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String page = req.getParameter("page");
        if(page != null && !"".equals(page)){
            req.getRequestDispatcher("WEB-INF/pages/" + page + ".html").forward(req, resp);
            return;
        }
        // 错误提示信息
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.println("请求路径错误!");
        writer.flush();
    }
}
通过这一个Servlet就解决了页面跳转问题,大大地提升了效率。

文章来源

版权声明:admin 发表于 2023年12月19日 am10:09。
转载请注明:Servlet中访问路径配置为/*时,使用请求转发造成内存溢出 | 银库

相关文章

本站主题由 OneNav 一为主题强力驱动