英文:
How to place a '/' in an incoming request in Spring
问题
External, unmodifiable service 使用 '___' 而不是 '/' 用于 URL 中的参数路径变量。所以 'http://localhost:9091/infra/Test/Test
' 变成 'http://localhost:9091/infra/Test___Test
'。
对于每个传入的请求,我需要确保任何可能的 '___' 在请求被处理之前都会转换成 '/' 而不改变映射。以下是我想出来的解决方案:
@Component
public class SlashFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
final HttpServletRequestWrapper wrapped = new HttpServletRequestWrapper(request) {
@Override
public String getServletPath() {
final String originalUrl = ((HttpServletRequest) getRequest()).getRequestURL().toString();
return originalUrl.replace("___", "/").replace("%20", " "); // 强调
}
};
filterChain.doFilter(wrapped, response);
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
return !request.getPathInfo().contains("___");
}
}
然而,这似乎没有起到作用。如果我收到 http://localhost:9091/infra/Test___Test
,它会变成 http://localhost:9091/infra/Test/Test
,并且我会收到一个错误:
DELETE /infra/Test___Test http: 500 INTERNAL_SERVER_ERROR {"status":500,"error":"Internal Server Error","message":"Invalid contextPath: 'http://localhost:9091/infra/Test/Test': must start with '/' and not end with '/'","path":"/infra/Test___Test"}
所以,我想让我们在这里对 '/' 进行编码!我将标记的行更改为:
return originalUrl.replace("___", "%2F").replace("%20", " ");
然而,这给我带来了以下错误:
DELETE /infra/Test___Test http: 500 INTERNAL_SERVER_ERROR {"status":500,"error":"Internal Server Error","message":"Invalid contextPath: 'http://localhost:9091/infra/Test%252FTest': must start with '/' and not end with '/'","path":"/infra/Test___Test"}
看起来它也转换了 '%','%2F
' 变成了 '%252F
'。我有点困惑了,已经整天在尝试这个和 RequestWrapper,但到目前为止什么都没用。有人有想法如何让它工作吗?
英文:
An external, unmodifiable service uses '___' instead of '/' for ~parameters~ path variables in URLs. So 'http://localhost:9091/infra/Test/Test
' becomes 'http://localhost:9091/infra/Test___Test
'.
For every incoming request, I need to make sure that any possible '___' gets converted into '/' without changing the mapping before the request is processed. This is what I came up with:
@Component
public class SlashFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
final HttpServletRequestWrapper wrapped = new HttpServletRequestWrapper(request) {
@Override
public String getServletPath() {
final String originalUrl = ((HttpServletRequest) getRequest()).getRequestURL().toString();
return originalUrl.replace("___", "/").replace("%20", " "); // emphasis
}
};
filterChain.doFilter(wrapped, response);
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
return !request.getPathInfo().contains("___");
}
}
However, this seems to effectively do nothing. If I receive http://localhost:9091/infra/Test___Test
, it becomes http://localhost:9091/infra/Test/Test
and I get an error:
DELETE /infra/Test___Test http: 500 INTERNAL_SERVER_ERROR {"status":500,"error":"Internal Server Error","message":"Invalid contextPath: 'http://localhost:9091/infra/Test/Test': must start with '/' and not end with '/'","path":"/infra/Test___Test"}
So, I thought let's encode the /
here! I changed the marked line to:
return originalUrl.replace("___", "%2F").replace("%20", " ");
However, this gave me the following error:
DELETE /infra/Test___Test http: 500 INTERNAL_SERVER_ERROR {"status":500,"error":"Internal Server Error","message":"Invalid contextPath: 'http://localhost:9091/infra/Test%252FTest': must start with '/' and not end with '/'","path":"/infra/Test___Test"}
It looks like it converts the % as well, and '%2F
' becomes '%252F
'. I'm kinda getting lost here, have spent all day fiddling with this and the RequestWrapper, but so far nothing works. Anyone got an idea how to make it work?
答案1
得分: 0
In the end, I realized that there was no real use for using path variables and we changed to request parameters. That was a lot easier than hardcoding some filter.
英文:
In the end, I realized that there was no real use for using path variables and we changed to request parameters. That was a lot easier than hardcoding some filter
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论