我对应该在url中发送的变量中的斜杠有一些问题。 例如id可能是这样的:
ID: /gfdge1/DkxA8P+jYw43
URL: localhost:8080/find-user//gfdge1/DkxA8P+jYw43
"error": "Internal Server Error",
"exception": "org.springframework.security.web.firewall.RequestRejectedException",
"message": "The request was rejected because the URL was not normalized.",
因为此斜线首先出现问题
在此之前,我在ID中间遇到这些斜杠的问题,但是我已经使用以下代码解决了这个问题:
@RequestMapping(name = "Get user data by ID", value = "/find-user/{userId}/**", method = RequestMethod.GET)
@ResponseBody
public User getUserData(@PathVariable String userId, HttpServletRequest request) {
final String path =
request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();
final String bestMatchingPattern =
request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();
String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path);
String id="";
if (null != arguments && !arguments.isEmpty()) {
id = userId + '/' + arguments;
} else {
id = userId;
}
return userService.getUserData(id);
}
,但是当斜杠放在首位时,这不适用于这种情况。 我也尝试使用RequestParam代替PathVariable,但是它存在一些特殊字符的问题,例如当我使用RequestParam时,它用空白替换'+',...
有人可以帮助我解决这个问题吗?
答案 0 :(得分:1)
使用Strings作为路径变量是一个固有的问题,这与代码无关,但与HTTP请求的解释方式无关,因此您无法在代码中进行任何操作来实现此目的。
您确实有一些选择:
我更倾向于2,因为对所有可能的问题字符/字符串保持1相当混乱且不必要。
要正确执行2,您应该考虑让所有REST获取者仅通过数字ID查找其相关实体,例如
localhost:8080 / find-user / 3
如果您需要添加其他搜索参数,例如用户名,那么您应该使用QueryDSL之类的东西来创建搜索参数的谓词,这些谓词将作为查询参数而不是路径变量传递,例如:
localhost:8080 / find-user?username = / gfdge1 / DkxA8P + jYw43