Решение выше не работает для меня, как ожидалось.Ответ 404 генерируется, когда я запрашиваю URL-адрес с расширением.
Я пришел с другим решением, которое не требует отключения grails.mime.file.extensions
и не требует дополнительного фильтра.Это модификация класса плагина org.codehaus.groovy.grails.plugins.springsecurity.AnnotationFilterInvocationDefinition
.Вам нужно отредактировать метод determineUrl
, как показано ниже (посмотрите на комментарии, чтобы определить изменения):
@Override
protected String determineUrl(final FilterInvocation filterInvocation) {
HttpServletRequest request = filterInvocation.getHttpRequest();
HttpServletResponse response = filterInvocation.getHttpResponse();
GrailsWebRequest existingRequest = WebUtils.retrieveGrailsWebRequest();
String requestUrl = request.getRequestURI().substring(request.getContextPath().length());
/** The following 2 lines were added */
int indexOfPeriod = requestUrl.indexOf('.');
String requestUrlForMatching = (indexOfPeriod != -1) ? requestUrl.substring(0, indexOfPeriod) : requestUrl;
String url = null;
try {
GrailsWebRequest grailsRequest = new GrailsWebRequest(request, response,
ServletContextHolder.getServletContext());
WebUtils.storeGrailsWebRequest(grailsRequest);
Map<String, Object> savedParams = copyParams(grailsRequest);
/* Use requestUrlForMatching instead of requestUrl */
for (UrlMappingInfo mapping : _urlMappingsHolder.matchAll(requestUrlForMatching)) {
configureMapping(mapping, grailsRequest, savedParams);
url = findGrailsUrl(mapping);
if (url != null) {
break;
}
}
}
finally {
if (existingRequest == null) {
WebUtils.clearGrailsWebRequest();
}
else {
WebUtils.storeGrailsWebRequest(existingRequest);
}
}
if (!StringUtils.hasLength(url)) {
// probably css/js/image
url = requestUrl;
}
return lowercaseAndStripQuerystring(url);
}
Проблема в том, что URL с расширениями не соответствуют ни одному URL в UrlMappings
с использованием UrlMappingsHolder.matchAll
метода.Таким образом, решение состоит в том, чтобы опустить расширение перед поиском совпадений.С этими изменениями все работает как положено.
Я также создаю запрос на извлечение с исправлением, доступным в https://github.com/grails-plugins/grails-spring-security-core/pull/24
Вы можете увидеть изменения в https://github.com/arcesino/grails-spring-security-core/commit/19f87168ec4422b4fe06cc6914adeb1bae4b8752
Протестированос версией 1.2.7.3