写请求路径时,把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;
}