0

我在 Pre-Handler Interceptor 中获得了 Controller 的 @PathVariable。

Map<String, String> pathVariable = (Map<String, String>) request.getAttribute( HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE );

但我希望修改@PathVariable 值(如下)。

@RequestMapping(value = "{uuid}/attributes", method = RequestMethod.POST)
public ResponseEntity<?> addAttribute(@PathVariable("uuid") String uuid, HttpServletRequest request, HttpServletResponse response) {

 //LOGIC
}

如何在进入控制器之前修改拦截器中的@PathVariable("uuid") 值? 我正在使用 Spring 4.1 和 JDK 1.6。我不能升级它。

4

2 回答 2

1

拦截器的一般用途是将通用功能应用于控制器。即所有页面上显示的默认数据、安全性等。您希望将其用于通常不应该执行的单个功能。

拦截器无法实现您想要实现的目标。首先,根据映射数据检测要执行的方法。在执行该方法之前,拦截器被执行。在这种情况下,您基本上想要更改传入请求并执行不同的方法。但是该方法已经被选中,因此它不起作用。

当您最终想要调用相同的方法时,只需添加另一个请求处理方法,该方法最终调用addAttribute或只是重定向到带有 UUID 的 URL。

@RequestMapping("<your-url>")
public ResponseEntity<?> addAttributeAlternate(@RequestParam("secret") String secret, HttpServletRequest request, HttpServletResponse response) {

    String uuid = // determine UUID based on request
    return this.addAttribute(uuid,request,response);
}
于 2019-03-18T06:59:36.057 回答
0

试试下面给定的代码。

public class UrlOverriderInterceptor implements ClientHttpRequestInterceptor {

private final String urlBase;

public UrlOverriderInterceptor(String urlBase) {
    this.urlBase = urlBase;
}

private static Logger LOGGER = AppLoggerFactory.getLogger(UrlOverriderInterceptor.class);

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    URI uri = request.getURI();
    LOGGER.warn("overriding {0}", uri);

    return execution.execute(new MyHttpRequestWrapper(request), body);

}

private class MyHttpRequestWrapper extends HttpRequestWrapper {
    public MyHttpRequestWrapper(HttpRequest request) {
        super(request);
    }

    @Override
    public URI getURI() {
        try {
            return new URI(UrlUtils.composeUrl(urlBase, super.getURI().toString())); //change accordingly 
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }
}

}

于 2019-03-18T05:38:05.177 回答