我有一个基于spring mvc的应用程序。我想在到达控制器之前修改请求URI。例如,控制器的RequestMapping为“abc / xyz”,但请求为“abc / 1 / xyz”。我想修改传入的请求以将其映射到控制器。
Solution1:实现拦截器并修改传入的请求URI。但是这里的问题是,由于没有控制器匹配URI模式“abc / 1 / xyz”,它甚至不会进入拦截器。(如果有的话,我可能会遗漏一些东西来启用它) 四处寻找可能是将URI作为控制器的请求映射。
还有哪些其他解决方案?有没有办法在春天来临之前处理这个请求。就像在web.xml中的过滤器处理它一样,我只是在弥补它。
答案 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);
}
}
}