首页 > 系统相关 >Servlet中访问路径配置为/*时,使用请求转发造成内存溢出

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

时间:2023-12-17 16:23:14浏览次数:33  
标签:路径 resp req writer 内存 转发 toPage Servlet

一、问题由来

  最近在测试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就解决了页面跳转问题,大大地提升了效率。

标签:路径,resp,req,writer,内存,转发,toPage,Servlet
From: https://www.cnblogs.com/yilangcode/p/17909216.html

相关文章

  • 多开软件对Windows电脑内存的占用情况
    当今,许多人在日常使用电脑时可能会遇到需要同时打开多个应用程序或者多个账户的情况。为了应对这种需求,一些用户选择使用多开软件来实现在同一台电脑上同时打开多个应用程序或账户的功能。然而,使用多开软件可能会对Windows电脑的内存占用产生一定的影响。首先,让我们来了解一下多......
  • 嵌入式系统中内存泄露的原因和避免措施
    在嵌入式系统开发中,内存泄露是一个常见而又隐蔽的问题,可能导致系统性能下降、不稳定甚至崩溃。本文将深入探讨嵌入式系统中内存泄露的原因,并提供一些避免措施,通过详细的代码演示展示如何在嵌入式环境中防范内存泄露。1.内存泄露的原因1.1动态内存分配未释放在嵌入式系统中,动态内......
  • Redis不同版本,内存分配,硬件的性能研究
    Redis不同版本,内存分配,硬件的性能研究前言Konwmore!Domore!Gainmore!骨折之后开始减肥.前段时间跳绳导致膝盖不舒服,现在改骑车和走路.在有限的没人有烦的时间里,还是想能够多学习一些东西.之前了解了isolcpus现在突然想内存分配可能也有性能影响.所以想研......
  • unigui显示uniTreeVview使用TUniTreeNode内存泄漏的问题【14】
    uniTreeVviewc创建一个tree,显示患者姓名(PatientName)。因为需要用到患者ID(PatientID),所以使用help:TPatientTreeNode=class(TUniTreeNode)//strictprivateFPatientID:string;functionGetPatientID:string;procedureSetPatientID(constValue:string)......
  • JVM虚拟机系统性学习-运行时数据区(方法区、程序计数器、直接内存)
    方法区方法区本质上是Java编译后代码的存储区域,存储了每一个类的结构信息,如:运行时常量池、成员变量、方法、构造方法和普通方法的字节码指令等内容方法区主要存储的数据如下:Class类型信息,如该Class为class类、接口、枚举、注解,类的修饰符等等信息方法信息(方法名称、方法返回......
  • 直播平台搭建,Java 内存溢出的排查方法
    直播平台搭建,Java内存溢出的排查方法JDK自带命令jstat-gcutil3381625020#监控jvm的内存使用情况jps-ml#输出虚拟机启动时传递给主类main()的参数,输出主类的全名jmap-F-dump:live,format=b,file=dump.bin85962#dump堆内存#分析方法#可以使用Vi......
  • 直播软件搭建,java代码获取内存信息
    直播软件搭建,java代码获取内存信息一、获取堆外内存@GetMapping("/panama")publicMap<String,Object>panama(){ByteBufferbuffer=ByteBuffer.allocateDirect(1*1024*1024);Map<String,Object>map=newHashMap<>();......
  • helloword执行过程,cpu从内存中读取数据
    1.cpu通过地址总线发出指令告诉内存控制器,我要操作哪块内存2.cpu通过控制总线向内存控制器发出读/写指令3.cpu通过数据总线,操作内存鼠标点击HelloWorld运行过程:1.点击鼠标,鼠标会发一个机器变更号---->usb控制器把信号传给---->系统总线---->南桥----->北桥---->cpu......
  • K8s 里如何优雅地使用 /dev/shm 实现容器间共享内存
    目录1.从dockerrun的--shm-size参数聊起2.Linux里的/dev/shm3.Docker对共享内存的支持4.K8s里如何设置/dev/shm大小4.1方案一:修改节点的Docker配置4.2方案二:通过Volume挂载一个大目录到Pod的/dev/shm4.3方案三:用K8s的方式共享内存5.总结1.从docker......
  • 进程间通信:共享内存区
    一、共享内存区所谓共享内存区,即程序通过固定大小的物理存储链接到本地内存中,这种IPC形式是最快的。管道、FIFO和消息队列的问题在于,两个进程要交换信息时,这些信息必须由内核传递。共享内存区示意图:共享内存区的限制:二、Posix共享内存区基于Posix共享内存区的生产者--消......