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

重命名为:带角度和Spring的CSRF(“不支持请求方法“删除”)

穆锋
2023-03-14

我正在尝试调用控制器的删除方法

Spring:

@RestController
@RequestMapping("/api")
@CrossOrigin
public class Controller
{
    @DeleteMapping("thing/item/{name}")
    public void deleteThing(@PathVariable String name)
    {
        System.out.println("CALL"); // Never called!!!
    }
}

角度7:

deleteTemplate(name: string) {
    const url = `host/api/thing/item/${name}`;
    return this.http.delete(url);
}

我发现了一些关于包含选项的信息:

httpOptions = {
    headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};

deleteTemplate(name: string) {
    const url = `${host}/api/thing/item/${name}`; // host is not relevant, same path with GET works.
    return this.http.delete(url, this.httpOptions);
}

但是我认为它甚至不需要,因为我发送的所有内容都在链接本身(没有json)。

每次:

WARN 15280 --- [io-8443-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' not supported]

如何解决这个问题?

发送DELETE时带有405个错误和前面的选项(带有200个代码)。它到达服务器并执行此错误。

编辑

上面是一个简化后仍然无法工作的代码示例。我理解你们的评论,但主持人可以是任何人,在这里并不重要。它的本地主机现在和前面提到的一样——它在到达endpoint的意义上工作。

为了检查我是否错了,我这样做了:

@Autowired
private RequestMappingHandlerMapping requestMappingHandlerMapping;

this.requestMappingHandlerMapping.getHandlerMethods()
                .forEach((e, k) -> System.out.println(e + "   OF   " + k));

启动后,它打印了我所期望的一切,包括:

{GET /api/thing/item/{name}}   OF   public myPackage.Thing myPackage.Controller.getThing(java.lang.String)
{DELETE /api/thing/item/{name}}   OF   public void myPackage.Controller.deleteThing(java.lang.String)

有什么想法吗?

共有2个答案

束俊材
2023-03-14

在路径的开头添加斜杠/。

@DeleteMapping("/thing/item/{name}")
孟晋
2023-03-14

该死的原来问题出在CSRF中,主要是隐藏的角度文档和误导性的Spring过滤器日志

我花了大约10个小时使它工作,但仅在生产中(Angular与Spring位于同一主机/端口上)。我将尝试让它在dev中工作,但这基本上需要重写Angular提供的、绑定到其默认值的整个模块。

现在,关于这个问题:

当我们想使用CSRF时,一切都从Spring Security开始(我们确实这么做了)。显然,CsrfFilter如果不能匹配它所期望的CSRF令牌,它就会爆炸,并返回到/error。这一切都发生在没有任何特定日志消息的情况下,但不支持简单的请求方法“DELETE”,从我的问题中我们知道它存在。

这不仅适用于DELETE,而且适用于所有操作请求(non-GET/HEAD)。

所有这些都指向“如何使用角度传感器设置CSRF?”。好了,我们开始:

  • https://angular.io/guide/http#security-xsrf-protection

它在默认情况下工作。基于Cookie头机制的CSRF。

但是等等,还有更多!

Spring需要为Cookie头机制配置bo。很高兴我们得到了:

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http.csrf().csrfTokenRepository(this.csrfRepo());
}

private CookieCsrfTokenRepository csrfRepo()
{
    CookieCsrfTokenRepository repo = new CookieCsrfTokenRepository();
    repo.setCookieHttpOnly(false);
    return repo;
}

它内置于spring中,实际使用的cookie/头名称与Angular使用的名称相同。但是回购怎么了。setCookieHttpOnly(false) ?好另一件糟糕的事情。您只需要将其设置为false,否则Angular的边将不起作用。

同样,这只适用于生产构建,因为Angular不支持外部链接。更多信息:Angular 6不向超文本传输协议请求添加X-XSRF-TOKEN标头

所以是的...为了在开发localhost中使用2台服务器,我需要第一台来重新创建https://angular.io/api/common/http/HttpClientXsrfModule机制来拦截非默认请求

编辑

根据JB Nizet的评论,我设计了一个适用于开发和生产的设置。事实上,代理是可怕的。在启用CSRF和SSL的情况下(在我的例子中),您还需要在Angular CLI上启用SSL,否则Angular将无法使用启用SSL的代理后端的CSRF,因此无法工作。

"serve": {
    "options": {
            "proxyConfig": "proxy.conf.json",
            "sslKey": "localhost.key",
            "sslCert": "localhost.crt",
            "ssl": true
    }
}

请注意,如果找不到,证书和密钥将自动生成:)对于Spring后端,您不需要相同的证书。我在那里使用单独的JK。

干杯

 类似资料:
  • 我有Java控制器: 并遇到以下问题:警告14068--[nio-8080-exec-3].w.s.m.s.defaultHandlerExceptionResolver:Resolved[org.springframework.web.httpRequestMethodNotSupportedException:Request method'DELETE'not support]它发生在我发送删

  • 我正在尝试使用Spring Security(4.1.3)和Angular 2.0.1实现CSRF保护 相关话题的来源很多,但我找不到明确的说明。有些说法甚至相互矛盾。 我读过关于springs的操作方法(尽管指南中描述了Angular 1 way)Spring Security guide,其中包含Angular,即

  • 我正在编写一个控制器来处理来自AJAX的帖子。我一直收到一个错误,那篇文章不受支持。我以前在尝试创建后控制器方法时从未遇到过以下错误,我希望有人能发现我在哪里搞砸了。 这是我为控制控制器中的帖子而编写的方法: 使用JQuery 1.10,这是请求它的Ajax调用: 我知道POST地址是正确的,因为将它转换成GET请求就可以了。此外,我还编写了其他POST请求,它们在同一个控制器类中也能正常工作。任

  • login.jsp 用户列表.jsp AppController.java 有2页:login.jsp-起始页,其中包括与登录和密码填充的形式-userlist.jsp结果列表“显示数据库中所有用户持久化”..首先显示登录页面,当我单击提交按钮时,我得到了这个错误:org . spring framework . web . servlet . pagenotfound-不支持请求方法“POST”

  • 我试图在这里输入代码`@RequestMapping(value=“/test”,method=RequestMethod.POST),但错误代码为 网状物xml是 springmvc.xmlindex.jsp I input submit botton brower为错误HTTP Status 405-请求方法'GET'不受支持类型状态报告消息请求方法'GET'不受支持描述指定的HTTP方法不允

  • 如何解决这个问题?