这是今天写spring boot程序时候遇到的奇葩问题。
首先,由于项目的静态资源我是放在如下项目的src/main/resources/static目录下面(这是使用spring boot项目默认创建的目录)
为了确保spring boot能够将 “http://localhost:8080/resources/css/main.css” 这样的静态文件匹配到该目录下,我在项目的application.properties添加了一行:
spring.mvc.static-path-pattern = /resources/**
这样做后,web前端就能正常访问到项目的静态资源了。但同时发现一个问题,这样做会莫名其妙的使日志系统输出o.s.web.servlet.PageNotFound告警(当用户访问不存在的页面时),默认的spring boot配置是不开启该告警的。
这个告警信息可以通过修改spring boot的logging配置来隐藏。在application.properties中添加一行:
logging.level.org.springframework.web.servlet.PageNotFound = ERROR
2016.2.23,我一开始以为是这个logging.xx.PageNotFound配置被莫名其妙修改了的原因,但后来测试了好久发现这个logging.xx.PageNotFound其实一直都是INFO级的,所以我怀疑可能是由于配置了static-path-pattern后导致mapping顺序有点不一样了,然后其中某个抛出了pagenotfound异常并输出异常了。后面再查查吧
然后,我发现Console终端时不时的弹出如下Warn
2016-02-22 00:10:46.243 WARN 6006 — [nio-8080-exec-1] o.s.web.servlet.PageNotFound : No mapping found for HTTP request with URI [/announce] in DispatcherServlet with name ‘dispatcherServlet’
但我并没有访问http://localhost:8080/annouce呀。这肯定是那个程序在后台自己发起的访问请求,我一开始怀疑是不是tomcat或者sts搞得,但根本google不到相关信息。于是我在项目代码中添加了一个RequestMapping来尝试捕获该请求。
@Controller public class AnnounceController { private static final Log logger = LogFactory.getLog(UserController.class); @RequestMapping({"announce", "announce.php"}) public @ResponseBody String announce(HttpServletRequest request) { logger.info("有个混蛋在访问 " + request.getRequestURI()); Enumeration<String> headers = request.getHeaderNames(); while (headers.hasMoreElements()) { String header = (String) headers.nextElement(); logger.info(header + ": " + request.getHeader(header)); } return "哪个王八蛋在访问 " + request.getRequestURI(); } }
然后测试发现输出如下:
除了第一个捕获的是我自己用firefox发起的访问,其他的都跟bittorrent有关的?瞥了一眼迅雷下载,估计只能是跟这家伙有关了。关掉迅雷下载,这个访问告警就没有了。
然后google了一下bt协议,发现果然跟/announce这个页面有关,看样子是迅雷在bt下载的时候会扫描本地的http://localhost:8080/announce页面,来判断本机是否开启tracker服务。(具体tracker干嘛的就没去解了,大概是记录共同下载者的信息吧)
SO,事情算是解决了。