3

我有一个基于 spring mvc 的应用程序。我想在请求 URI 到达控制器之前修改它。例如,控制器的 RequestMapping 是“abc/xyz”,但发出的请求是“abc/1/xyz”。我想修改传入请求以将其映射到控制器。

解决方案1:实现拦截器并修改传入请求URI。但这里的问题是,由于没有与 URI 模式“abc/1/xyz”匹配的控制器,它甚至不会进入拦截器。(如果它在那里,我可能会遗漏一些东西来启用它)绕过它可能是将两个 URI 作为控制器的请求映射。

还有哪些其他解决方案?有没有办法在春天到来之前处理这个请求。正如在 web.xml 中的过滤器中处理它一样,我只是在弥补它。

4

3 回答 3

4

您可以编写一个 servletFilter来包装HttpServletRequest并为方法返回不同的值getRequestURI。像这样的东西:

public class RequestURIOverriderServletFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        chain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
            @Override
            public String getRequestURI() {
                 // return what you want
            }
        }, response);
    }

    // ...

 }

servlet 过滤器配置必须添加到web.xml.

但是说真的,可能还有其他方法可以解决您的问题,除非您有充分的理由,否则您不应该这样做。

于 2013-07-09T17:39:35.853 回答
1

为了实现这一点,您应该替换调用 uri 时受影响的每个地方。

没有提到的地方是INCLUDE_SERVLET_PATH_ATTRIBUTE是内部访问的深入。

public class AuthFilter implements Filter {

private final Logger logger = LoggerFactory.getLogger(AuthFilter.class);
private final String API_PREFIX = "/api";

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String requestURI = httpRequest.getRequestURI();
    if (requestURI.startsWith(API_PREFIX)) {
        String redirectURI = requestURI.substring(API_PREFIX.length());
        StringBuffer redirectURL = new StringBuffer(((HttpServletRequest) request).getRequestURL().toString().replaceFirst(API_PREFIX, ""));
        filterChain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) request) {
            @Override
            public String getRequestURI() {
                return redirectURI;
            }

            @Override
            public StringBuffer getRequestURL() {
                return redirectURL;
            }

            @Override
            public Object getAttribute(String name) {
                if(WebUtils.INCLUDE_SERVLET_PATH_ATTRIBUTE.equals(name))
                    return redirectURI;
                return super.getAttribute(name);
            }
        }, response);
        
    } else {
        filterChain.doFilter(request, response);
    }
}
}
于 2020-03-06T15:54:16.730 回答
0

您可以使用专门用于此目的的 URL Re-Write,即将一个请求 URI 转换为基于某些正则表达式的另一个 URI。

于 2014-12-02T06:00:35.697 回答