这几天在使用SpringBoot2的时候,发现了许多奇奇怪怪的bug,一样的配置,在Spring中不会发生的问题,在SpringBoot下突然就冒出来了。
通配符的使用:
为了减少页面的配置,经常会使用通配符,如下列代码,作用是:Url自动匹配core文件夹下的同名文件。
@RequestMapping(value = "core/**", method = RequestMethod.GET) public void core() { }
但是在SpringBoot下,这是十分危险的,如果未找到页面,代码会尝试寻找跟它匹配的路径,自动地帮我们去转发页面,转发之后依旧找不到,然后继续转发,始终未找到目标页面,就产生了无限转发,最终导致内存溢出(现象如此,暂未查看源码)。
下列日志:因为未找到 core/excel 路径,DispatcherServlet竟然自动拼接路径,然后进行页面转发 ,转发完还是找不到,然后路径就越拼接越长,最后内存溢出。
2019-12-17 00:32:46.614 [http-nio-8081-exec-3] DEBUG org.springframework.web.servlet.DispatcherServlet - "FORWARD" dispatch for GET "/Sea/core/
excel/core/excel/core/excel/core/excel/core/excel/core/excel/core/excel/core/excel/list?_bust=1576513963087", parameters={masked}
简单的处理方式就是在路径结尾加上后缀
@RequestMapping(value = "core/**/*.ftl", method = RequestMethod.GET) public void core() { }
静态资源与模版不要取同名:
static下的资源文件都是可以直接访问的,template下的文件,配置后方可使用,这就产生一个问题:各放1个同名文件会如何?
比如:在static文件夹放了a.js,然后在template文件夹放了a.ftl,然后将两个路径前缀设置成一个样,使用 ‘xx/xx/a’ 路径进行访问。很明显,只有其中1个能访问,在配置了RequestMapping的情况下,未找到页面之后,直接报404错误,而不会再去查找static目录;如果没配置 RequestMapping,则直接访问static目录。
如果希望让程序自动去识别,要么在static放置a.js,要么就在template放置a.ftl,存在哪个文件,自动获取哪个,这种设计则是不允许的。
因此,static和template两个目录中的文件,尽可能选用完全不同的命名方式,避免出现意想不到的错误。
而且,Servlet下需要很清楚一点,请求最后的扩展名,经常是被程序直接忽略的。比如 http://localhost/xx/1.png,最后面的 “.png”极有可能被忽略,扩展名本身可写可不写,它并不影响程序的执行,因此,如果在目录中放置了同名文件,则需要着重观察代码的执行情况。