requestmapping - spring mvc netbeans
Barra codificada(% 2F) con la ruta Spring RequestMapping param da HTTP 400 (6)
Esta no es una pregunta de referencia duplicada, porque es específica de Spring. Quien haya agregado eso (¡3 años después del hecho!) No se molestó en leer la pregunta o el hilo de comentarios para ver cuál era la respuesta real. La respuesta aceptada no es exactamente la respuesta, pero el autor de la respuesta nunca regresó y la editó como pedí.
Dado el método de descanso a continuación, Spring 3.1 da un error 400 con "La solicitud enviada por el cliente fue sintácticamente incorrecta ()". cuando el parámetro del token
contiene una barra codificada de URL (% 2F), por ejemplo, " https://somewhere.com/ws/stuff/lookup/resourceId/287559/token/R4o6lI%2FbBx43/userName/jim " Sin el% 2F todo funciona bien. Un tercero ya está llamando a este servicio (¡por supuesto!), Así que no puedo cambiar lo que envían, al menos a corto plazo. ¿Alguna idea sobre cómo solucionar esto en el lado del servidor?
Este problema se describe muy bien aquí https://jira.springsource.org/browse/SPR-8662 aunque ese problema está relacionado con UriTemplate, que no estoy usando y que puedo decir.
@RequestMapping("/ws/stuff/**")
@Controller
public class StuffController {
@RequestMapping(value = "/ws/stuff/lookup/resourceId/{resourceId}/token/{token}/userName/{userName}", method = RequestMethod.GET)
public @ResponseBody
String provisionResource(@PathVariable("resourceId") String resourceId, @PathVariable("token") String token, @PathVariable("userName") String userName, ModelMap modelMap,
HttpServletRequest request, HttpServletResponse response) {
return handle(resourceId, userName, request, token, modelMap);
}
}
Nota: Esto está en Glassfish 3.1.2, y al principio era Grizzly / Glassfish que no aceptaba la barra, pero
-Dcom.sun.grizzly.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
arreglado eso
asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.http.encoded-slash-enabled=true
no parece ayudar
Acabamos de encontrarnos con este problema en mi oficina, hicimos la sugerencia anterior de lo que Solubris dijo donde lo pusiste en un parámetro de consulta. El único requisito adicional es que los datos también pueden tener un ''&'', lo que desordenaría el parámetro de consulta. Todo lo que tuvimos que hacer es codificar el texto antes de que se envíe en la URL e incluso ''&'' fueron eliminados.
Aquí hay una solución para Spring 3.2.4 (también debería funcionar para otras versiones). Uno debe sobrescribir el valor predeterminado UrlPathHelper
public class UrlPathHelperFixed extends UrlPathHelper {
public UrlPathHelperFixed() {
super.setUrlDecode(false);
}
@Override
public void setUrlDecode(boolean urlDecode) {
if (urlDecode) {
throw new IllegalArgumentException("Handler [" + UrlPathHelperFixed.class.getName() + "] does not support URL decoding.");
}
}
@Override
public String getServletPath(HttpServletRequest request) {
String servletPath = getOriginatingServletPath(request);
return servletPath;
}
@Override
public String getOriginatingServletPath(HttpServletRequest request) {
String servletPath = request.getRequestURI().substring(request.getContextPath().length());
return servletPath;
}
}
E inyectarlo en el controlador de mapas:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="order" value="-1"></property>
<property name="urlPathHelper">
<bean class="com.yoochoose.frontend.spring.UrlPathHelperFixed"/>
</property>
</bean>
Después de un día de trabajo duro, ahora funciona para mí :-)
Se sugirió al equipo de Spring como https://jira.springsource.org/browse/SPR-11101
Esta podría ser su respuesta: la barra diagonal urlencoded está rompiendo la URL
Sugeriría no poner eso en la ruta, muévalo a un parámetro de solicitud en su lugar.
Trabajar alrededor de
Usted podría cambiar el RequestMapping a
@RequestMapping(value = "/ws/stuff/lookup/resourceId/**", method = RequestMethod.GET)
y luego analizar las variables de ruta manualmente desde el objeto de solicitud.
He encontrado esta solución que está funcionando para mí;
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
justo antes de springApplication.run (args);
y añada el siguiente código en la clase de aplicación
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setUrlDecode(false);
configurer.setUrlPathHelper(urlPathHelper);
}
Para la aplicación de arranque de primavera esto funcionó para mí ...
Versión 1 Añadir
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
a su archivo application.properties
La versión 2 ejecuta su aplicación de arranque de primavera de esta manera.
static void main(String[] args) {
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
SpringApplication.run this, args
}
Versión 3 o ejecute su aplicación java con -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH = true
Esta variable de ruta de barra diagonal codificada% 2F para mí.
para la bota de primavera, lo siguiente hizo el truco
@SpringBootApplication
public class Application extends WebMvcConfigurerAdapter {
public static void main(String[] args) throws Exception {
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
SpringApplication.run(Application.class, args);
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setUrlDecode(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}