在springmvc中修改请求URI



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

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

还有什么其他解决方案?在春天到来之前,有没有办法处理这个请求。就像在web.xml中的filter中处理它一样,我只是在编造它。

您可以编写一个servlet Filter,它封装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中。

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

为了实现这一点,您应该替换调用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);
    }
}
}

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

最新更新