Grails UrlMappings con valores de parámetros que contienen & # 8220;. & # 8221;
-
03-07-2019 - |
Pregunta
Dado este UrlMapping:
"/foo/$foobar" {
controller = "foo"
action = "foo"
constraints {
}
}
Combinado con este controlador:
class FooController {
def foo = {
def foobar = params.foobar
println "foobar=" + foobar
}
}
Y con estas solicitudes:
- http: // localhost: 8080 / app / foo / example.com dar el resultado " foobar = ejemplo "
- http: // localhost: 8080 / app / foo / examplecom proporcione la salida " ; foobar = examplecom "
Parece que Grails corta el '' foobar '' parámetro en el primer punto (". "). ¿Es esto intencional? ¿Hay alguna solución si quiero usar parámetros que contienen puntos en mis asignaciones de URL?
Solución
Esto se puede resolver configurando ...
grails.mime.file.extensions = false
... en Config.groovy.
Parece que Grails está tratando de hacer algo de magia MIME detrás de escena basándose en el sufijo del nombre del archivo.
Actualizado: Alguna información adicional de Grails JIRA .
Este es el código ofensivo en UrlMappingsFilter.java:
if(WebUtils.areFileExtensionsEnabled()) {
String format = WebUtils.getFormatFromURI(uri);
if(format!=null) {
MimeType[] configuredMimes = MimeType.getConfiguredMimeTypes();
// only remove the file extension if its one of the configured mimes in Config.groovy
for (MimeType configuredMime : configuredMimes) {
if (configuredMime.getExtension().equals(format)) {
request.setAttribute(GrailsApplicationAttributes.CONTENT_FORMAT, format);
uri = uri.substring(0, (uri.length() - format.length() - 1));
break;
}
}
}
}
WebUtils.areFileExtensionsEnabled () devuelve el valor de " grails.mime.file.extensions " configuración configurada en Config.groovy.