SpringBoot2(八)RequestMapping注意事项

这几天在使用SpringBoot2的时候,发现了许多奇奇怪怪的bug,一样的配置,在Spring中不会发生的问题,在SpringBoot下突然就冒出来了。

通配符的使用:

  为了减少页面的配置,经常会使用通配符,如下列代码,作用是:Url自动匹配core文件夹下的同名文件。

  @RequestMapping(value = "core/**", method = RequestMethod.GET)
  public void ueditor() {
  }

  但是在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 markdown() {
  }

静态资源与模版不要取同名:

  static下的资源文件都是可以直接访问的,template下的文件,配置后方可使用,这就产生一个问题:各放1个同名文件会如何?

  比如:在static文件夹放了a.js,然后在template文件夹放了a.ftl,然后将两个路径前缀设置成一个样,使用 ‘xx/xx/a’ 路径进行访问,很明显,只有其中1个能访问。

  然后就有了个大胆的想法:希望让程序自动去识别,要么在static放置a.js,要么就在template放置a.ftl,存在哪个文件,自动获取哪个,但是,很遗憾,这种设计则是不允许的。

  而且,下列这种通配符配置也是不允许的,它不会去找静态资源,确定找不到模版文件后,直接报404错误。

  @RequestMapping(value = "core/**", method = RequestMethod.GET)
  public void ueditor() {
  }


  Servlet下需要很清楚一点,请求最后的扩展名,经常是被程序直接忽略的,比如 http://localhost/xx/1.png,最后面的 “.png”极有可能被忽略,如果存在同名文件 1.jpg,一定要检查代码执行情况。

 

猜你喜欢

转载自www.cnblogs.com/chenss15060100790/p/12052328.html
今日推荐