写请求路径时,把controller的请求代码和html的请求路径一样,结果发现进入了死循环。
@RequestMapping("/system/enforcement/mytask") public String mytaskList(){ return "system/enforcement/mytask"; }当时请求路径为localhost:8380/EMGD/system/enforcement/mytaskList.html
发现一直会进入Controller的代码,静态资源也配置了
<mvc:resources location="/" mapping="/favicon.ico"/> <mvc:resources location="/public/" mapping="/public/**" /> <mvc:resources location="/system/" mapping="/system/**"/>发现没有效果。
打断点发现客户端发送一个请求会进入DispatcherServlet类
try { processedRequest = checkMultipart(request); multipartRequestParsed = (processedRequest != request); // Determine handler for the current request. //获得对应的处理器链链 和 handle mappedHandler = getHandler(processedRequest); if (mappedHandler == null || mappedHandler.getHandler() == null) { noHandlerFound(processedRequest, response); return; } //根据handlerMappings 来获取合适的处理器链 第一个匹配的hanldemethod为org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@40fd25bb protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { for (HandlerMapping hm : this.handlerMappings) { if (logger.isTraceEnabled()) { logger.trace( "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'"); } HandlerExecutionChain handler = hm.getHandler(request); if (handler != null) { return handler; } } return null; } //如果找不到一样的路径 就会依次循环 所有请求路径最好和controller的路径一直 这里看到匹配规则 xxx.* 和 当前路径匹配 因为的请求路径system/enforcement/mytaskList.html 和 system/enforcement/mytaskList 一致 所有 第二次 又会调到controller的方法里面 就会造成死循环 private String getMatchingPattern(String pattern, String lookupPath) { if (pattern.equals(lookupPath)) { return pattern; } if (this.useSuffixPatternMatch) { if (!this.fileExtensions.isEmpty() && lookupPath.indexOf('.') != -1) { for (String extension : this.fileExtensions) { if (this.pathMatcher.match(pattern + extension, lookupPath)) { return pattern + extension; } } } else { boolean hasSuffix = pattern.indexOf('.') != -1; if (!hasSuffix && this.pathMatcher.match(pattern + ".*", lookupPath)) { return pattern + ".*"; } } } if (this.pathMatcher.match(pattern, lookupPath)) { return pattern; }