当前位置: 首页 > 知识库问答 >
问题:

如何将CORS头添加到BasicErrorController呈现的Spring错误页面?

姬凡
2023-03-14

我有一个单页客户端,由Spring Boot REST MVC API应用程序(Spring Boot版本1.5.2)提供服务。

我的应用程序通过Auth0 JWT令牌进行保护。当一切正常时,响应的CORS头由ServletFilter提供,该过滤器作为设置安全性的一部分进行配置:

  protected void configure(HttpSecurity http) throws Exception {
    ...
    http.addFilterBefore(simpleCORSFilter(), Auth0AuthenticationFilter.class);
    ...
  }

到目前为止,这似乎在我测试它的任何地方都可以使用,但有一个地方它不起作用,那就是默认的Spring错误页面(路径“/错误”,默认情况下由BasicErrorController类呈现)。

当我的服务方法中出现异常时,错误页面会工作,并在响应体中将我想要的内容呈现为JSON,但客户端应用程序无法访问http响应体,因为响应缺少CORS头。

所以问题是:“如何将CORS标头添加到错误页面”?

我是否应该从安全设置中删除CORS筛选器,并在更全局范围内应用CORS筛选器?我在Spring文档中找不到任何相关内容。

或者我应该编写一个自定义错误控制器?留档中自定义错误控制器的唯一示例似乎允许您返回一个字符串。


共有2个答案

萧辰沛
2023-03-14

结合Poorvi的答案和Joni Karppinen的自定义错误控制器代码,可以得出:

@RestController
public class ErrorController 
implements org.springframework.boot.autoconfigure.web.ErrorController 
{
  private static final String PATH = "/error";

  @Autowired private ErrorAttributes errorAttributes;

  @Override
  public String getErrorPath(){
    return PATH;
  }

  // I guess when time comes to lock down cors header, we could use a spring 
  // value configuration here to share with corsfilter.
  @CrossOrigin("*")  
  @RequestMapping(value = PATH, produces = "application/json")
  public @ResponseBody
  ErrorJson error(HttpServletRequest request, HttpServletResponse response){
    return new ErrorJson(
      response.getStatus(), 
      getErrorAttributes(request, false) );
  }

  private Map<String, Object> getErrorAttributes(
    HttpServletRequest request,
    boolean includeStackTrace
  ){
    RequestAttributes requestAttributes = new ServletRequestAttributes(request);
    return errorAttributes.getErrorAttributes(
      requestAttributes,
      includeStackTrace);
  }  

}

class ErrorJson {

  public Integer status;
  public String error;
  public String message;
  public String timeStamp;
  public String trace;

  public ErrorJson(int status, Map<String, Object> errorAttributes){
    this.status = status;
    this.error = (String) errorAttributes.get("error");
    this.message = (String) errorAttributes.get("message");
    this.timeStamp = errorAttributes.get("timestamp").toString();
    this.trace = (String) errorAttributes.get("trace");
  }

}

这似乎对我很有用。

罗华翰
2023-03-14

您可以为错误定义单独的控制器,并允许使用

@CrossOrigin("*")
 类似资料:
  • 问题内容: 我正在写一些演示Web服务器,提供静态html,css和javascript。服务器看起来像 我的客户端javascript使ajax调用到其他服务器。我该如何添加 对我的服务器响应,以便客户端javascript可以进行ajax调用? 问题答案: 自从Express宠坏了我以来,弄清楚这个问题有点麻烦。 看看enable cors。基本上,您需要做的是添加到要启用cors的域中。re

  • 问题内容: 我已经开发了一个Restfull应用程序,我想添加另一个Web应用程序来使用其服务,因此我进行了以下Ajax调用: 我得到这个例外: 对象{readyState:0,状态:0,statusText:“ SyntaxError:无法执行’setRequestHeader’…-Origin: ‘不是有效的HTTP标头字段名称。”}错误DOMException:无法在’XMLHttpRequ

  • 问题内容: 如何使用itext从html源向pdf添加标头? 当前,我们扩展了PdfPageEventHelper并覆盖了这些方法。工作正常,但是当我进入2个以上页面时,它将引发RuntimeWorkerException。 问题答案: 通常, 禁止 在事件中添加内容。这是 禁止 添加内容到的对象。您应该使用而 不是 文档在方法中添加页眉和页脚。此外:通过一遍又一遍地解析HTML,您正在浪费大量C

  • 问题内容: 我在将新的简单XWPFTable添加到XWPFHeader(或Footer)时遇到了严重的麻烦。不幸的是,似乎只有一个人遇到相同的问题(https://bz.apache.org/bugzilla/show_bug.cgi?id=57366#c0)。 有谁有办法实现这一目标? 任何帮助将不胜感激! 亲切的问候… 〜丹尼尔 问题答案: 这可以使用公共XWPFTable insertNew

  • 如果用户没有输入我编码的两个名称,我如何改变/更新以下来自spring MVC的REST调用以返回一个错误…像是找不到的东西?

  • 亲切的问候... ~丹尼尔