SpringBoot2(八)使用模版引擎时的注意事项

如今基本采用后端分离方式开发,本文内容可以不需要了解,作者用的是 Freemarker 模版引擎。

 

这几天在使用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” 写与不写,不会影响程序的执行,如果在目录中放置了同名文件(不同扩展名),需要着重观察代码的执行情况。

 

posted on 2019-12-17 01:13  疯狂的妞妞  阅读(2938)  评论(0编辑  收藏  举报

导航