在spring mvc中修改请求URI

时间:2013-07-09 13:13:13

标签: spring spring-mvc uri interceptor

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

Solution1:实现拦截器并修改传入的请求URI。但是这里的问题是,由于没有控制器匹配URI模式“abc / 1 / xyz”,它甚至不会进入拦截器。(如果有的话,我可能会遗漏一些东西来启用它) 四处寻找可能是将URI作为控制器的请求映射。

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

3 个答案:

答案 0 :(得分:1)

您可以编写一个包含Filter的servlet 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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

为了实现这一目标,您应该在致电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);
    }
}
}