我有一个单页客户端,由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文档中找不到任何相关内容。
或者我应该编写一个自定义错误控制器?留档中自定义错误控制器的唯一示例似乎允许您返回一个字符串。
结合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");
}
}
这似乎对我很有用。
您可以为错误定义单独的控制器,并允许使用
@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调用以返回一个错误…像是找不到的东西?
亲切的问候... ~丹尼尔