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就解决了页面跳转问题,大大地提升了效率。
Servlet中访问路径配置为/*时,使用请求转发造成内存溢出的更多相关文章
- servlet中web.xml配置
		
常见的Servlet中url-pattren的配置 1.固定配置, 如:/hi 引入通配符 * 2.以"/XXX"开头,以"*"结尾 3.以"*&qu ...
 - Win7中的IIS配置asp时出现“出现403 文件夹禁止訪问错误”!
		
Win7中的IIS配置asp时出现"出现403 文件夹禁止訪问错误"! 在[默认文档]中设一下启动文件即可了.
 - Servlet+JSP 对外访问路径配置
		
servlet类似 servlet配置为: <servlet> <servlet-name>Demo01_OutWrite</servlet-name> ...
 - servlet中web.xml配置详解
		
Web.xml常用元素 <web-app> 所有部署描述符文件的顶层(根)元素 <display-name></display-name>定义了WEB应用的名字 & ...
 - 七、SpringBoot项目集成JSP以及项目不同启动方式及访问路径配置
		
1.创建JSP目录 在src/main目录下创建目录webapp/WEB-INF/jsp用于存放jsp页面,如下图: 然后再改文件夹下面我们创建JSP文件: 大家在使用IDEA 的new菜单创建JSP ...
 - Servlet----------在 Servlet 中的xml配置
		
今天弄了大半天,才弄好了,还是请教了别人,主要原因在于把web.xml文件放在了WEB-INF文件夹下面了,正常的情况是在WebRoot下面的. 还有一个,我是在MyEclipse中操作的,起初不知道 ...
 - Servlet中关于路径的小结
		
URL(统一 资源定位符).URI(统一资源标识符)都是由资源路径和资源名称组成. 访问路径按照路径是否可以独立完成资源准确定位的判别标准,可以将访问路径分为绝对路径与相对路径. 关系:绝对路径 ...
 - Servlet中Web.xml配置详解(二)
		
5.2 分配JSP初始化参数给JSP页面提供初始化参数在三个方面不同于给servlet提供初始化参数.1)使用jsp-file而不是servlet-class.因此,WEB-INF/web.xml文件 ...
 - Jenkins访问路径配置自定义的相对路径
		
Jenkins安装时没有配置自定义的相对访问路径,例如配置的端口是29957,那访问路径就是http://localhost:29957.以下介绍把访问路径改成http://localhost:299 ...
 - Servlet中相对路径与绝对路径
		
相对路径与绝对路径: 相对路径:相对路径指的是相对于当前文件所在目录的路径! http://localhost:8080/servlet01/ http://localhost:8080/servle ...
 
随机推荐
- TienChin 引入 MyBatisPlus
			
在父工程当中添加版本号,统一管理: <mybatis-plus.version>3.5.1</mybatis-plus.version> 在父工程当中添加 MyBatisPlu ...
 - 3D圆饼图,可修改颜色,图片等,具体见代码:
			
组件代码: <template> <!-- 饼图 --> <div :id="histogramId" v-bind:style="{hei ...
 - C/C++ 使用CRC检测磁盘文件完整性
			
当软件被开发出来时,为了增加软件的安全性,防止被破解,通常情况下都会对自身内存或磁盘文件进行完整性检查,以防止解密者修改程序,我们可以将exe与dll文件同时做校验,来达到相互认证的目的,解密者想要破 ...
 - 从嘉手札<2023-12-15>
			
荒原 朔方 2023.12.15 人生实属是很愁的时间 愁到听不见一点雪花飘落的声音 愁到连随便写点文章都算得上拼尽全力 萧瑟的北风吹散了为数不多的倔强 漫天的雪花飞舞 埋葬的是那么多年走过的春秋 ...
 - 使用KVM创建OEL虚拟机
			
在Linux工作站上使用KVM创建虚拟机. 首先说下我的需求: 1.其他LAN内的笔记本也可以连接到这些KVM的虚拟机,因此需要配置使用桥接网络 2.创建一个虚拟机,采用最小化安装系统,作为基础模版, ...
 - .NET 云原生架构师训练营(RGCA 四步架构法)--学习笔记
			
RGCA Requirement:从利益相关者获取需求 Goal:将需求转化为目标(功能意图) Concept:将目标扩展为完整概念 Architecture:将概念扩展为架构 目录 从利益相关者获取 ...
 - .NET 云原生架构师训练营(模块二 基础巩固 HTTP管道与中间件)--学习笔记
			
2.3.2 Web API -- HTTP管道与中间件 管道 中间件 ASP.NET Core 中间件:https://docs.microsoft.com/zh-cn/aspnet/core/fun ...
 - Hive中insert into 和 insert overwrite的区别
			
相同点 insert into 和 insert overwrite 都是往表中插入数据的. 不同点 区别1: insert into :其实是将数据追加到表的末尾,注意:不是覆盖,是追加. inse ...
 - 图解3种常见的深度学习网络结构:FC、CNN、RNN
			
01 全连接网络结构 全连接(FC)网络结构是最基本的神经网络/深度神经网络层,全连接层的每一个节点都与上一层的所有节点相连. 全连接层在早期主要用于对提取的特征进行分类,然而由于全连接层所有的输出与 ...
 - Kubernetes上使用Ingress Nginx将服务发布到外部IP
			
Kubernetes的网络结构 K8s的网络相对比较复杂, 包含了如下几类IP地址: Host Network 运行K8s集群的宿主服务器的内网IP, 其网段在配置宿主机时设置. 这些服务器可能是物理 ...