java - Spring Controller 针对 404 状态和 url 模式的异常处理

标签 java spring spring-boot spring-mvc model-view-controller

是否可以处理特定 url 模式的 404 状态? 如果有人访问“localhost:8080/login/other”,但没有“login/other”的请求映射,我想显示登录页面。 Controller 类如下:

@RequestMapping("/login")
@Controller
public class UserManagerController {

    @RequestMapping({"/", ""})
    public String getLoginPage() {
        return "login.html";
    }

}

我无法添加“/login/**”,因为这与我的静态内容匹配,并且对 js 或 css 的任何请求都与该端点匹配。示例 html:

<!DOCTYPE html>
<html lang="en">
  <head>
    ...
</head>
    ...
  <script src="/login/some.js"</script>
</html>

最佳答案

你可以使用这样的东西:

import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class GlobalErrorController implements ErrorController {

  @RequestMapping("/error")
  public String handleError(HttpServletRequest request, Model model) {
    Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
    Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");
    model.addAttribute("errorMessage", exception);
    model.addAttribute("statusCode", statusCode);
    if (Objects.nonNull(statusCode)
        && HttpStatus.NOT_FOUND.value() == statusCode) {
      return "resource-not-found";// in your case you should use: return "redirect:/login";
    }
    return "exception";
  }

  @Override
  public String getErrorPath() {
    return "/error";
  }
}

该代码会打开“资源未找到”页面,以防用户打开无效网址,例如 localhost:8080/invalid-page

对于您的情况,您可以使用方法“handleError()”返回“redirect:/login”;如果状态代码是 404

在我的项目中,我认为打开“资源未找到”页面和将用户重定向到主页的按钮会更合乎逻辑,您可以在此处查看它是如何工作的: https://macari-home-finance.herokuapp.com/login/invalid-url 这是我的项目 https://github.com/ruslanMacari/HomeFinance

希望对你有帮助

关于java - Spring Controller 针对 404 状态和 url 模式的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62172564/

相关文章:

java - 创建用户对象后无法正确获取它

java - Spring 。如何将 ObjectId 字段作为 String 返回以响应 Rest Controller ?

java - 自定义安全表达式

spring - 如何配置自定义 Kafka 反序列化器并使用 KafkaListener 获取使用的 JSON 数据

java - 检查列表中是否有相同的值

java - 在 Docker 容器上开发 Java (Maven) 应用程序

java - 这些代码行是如何推导出公式的?

java - 如何复制 ByteBuffer 的内容?

java - 创建名为“org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator#0”的bean时出错?

java - Hibernate中查询继承实体时`Unknown column ' Camera ' in ' where子句`