use*_*191 2 java spring spring-boot
我有一个简单的休息控制器,可以捕获错误。我想获得浏览器发送到服务器的实际 URL,但 servlet 给了我一个不同的 URL。
如果我导航到127.0.0.1/abc404 错误被触发,它被路由到/error定义的处理程序。但是,输出给了我结果127.0.0.1/error而不是127.0.0.1/abc. 如何获取原始网址?
@RestController
public class IndexController implements ErrorController {
@RequestMapping("/")
public String index() {
return "OK";
}
@RequestMapping("/error")
public String error(HttpServletRequest request) {
System.out.println("ERR: " + request.getRequestURL() + " : " + request.getRequestURI());
return "ERR";
}
@Override
public String getErrorPath() {
return "/error";
}
}
Run Code Online (Sandbox Code Playgroud)
您可以定义自己的@ExceptionHandler,在通过/error映射处理之前将原始请求 URI 保存为请求的属性:
@ExceptionHandler(Exception.class)
public void handleException(HttpServletRequest req, HttpServletResponse resp) throws Exception {
req.setAttribute("originalUri", req.getRequestURI());
req.getRequestDispatcher("/error").forward(req, resp);
}
Run Code Online (Sandbox Code Playgroud)
然后originalUri在/error您使用的任何映射实现中读取新属性:
@RequestMapping("/error")
public String error(HttpServletRequest request) {
System.out.println("ERR: " + request.getAttribute("originalUri"));
return "ERR";
}
Run Code Online (Sandbox Code Playgroud)
您还可以尝试扩展 Spring MVC 中可用的其他错误处理类来添加此行为,例如ResponseEntityExceptionHandler. 请注意,forward()我的示例中的 可能被认为是肤浅的,因为可以返回ResponseEntityfrom @ExceptionHandler。
| 归档时间: |
|
| 查看次数: |
7528 次 |
| 最近记录: |