Java “弹簧启动错误”;请求方法';邮政';“不支持”;使用Ajax函数
我有一个带有url的页面”http://localhost:8080/clientes/cadastrar“我在这个页面上有一个按钮,当按下按钮时会打开一个模式来插入一些信息(姓名、电子邮件等)。问题是,当我在此模式中单击“Save button”(保存按钮)并使用onclick函数调用Ajax函数时,会出现以下错误:Java “弹簧启动错误”;请求方法';邮政';“不支持”;使用Ajax函数,java,ajax,spring-boot,spring-mvc,model-view-controller,Java,Ajax,Spring Boot,Spring Mvc,Model View Controller,我有一个带有url的页面”http://localhost:8080/clientes/cadastrar“我在这个页面上有一个按钮,当按下按钮时会打开一个模式来插入一些信息(姓名、电子邮件等)。问题是,当我在此模式中单击“Save button”(保存按钮)并使用onclick函数调用Ajax函数时,会出现以下错误: 2021-03-11 16:30:31.973 WARN 1200 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerException
2021-03-11 16:30:31.973 WARN 1200 --- [nio-8080-exec-5] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
以下是AJAX函数:
<script th:src="js/AddEmailCliente.js" th:fragment="js"></script>
<script th:inline="javascript" th:fragment="inlinescript">
function salvarEmail() {
var cliente = /* [[cliente]] */ 0;
var nome = Document.getElementById('nome').value;
var email = Document.getElementById('email').value;
var envio_cobranca = Document.getElementById('envio_cobranca').checked ? true : false;
$.ajax({
url : "/emails/salvar",
type : 'POST',
contentType : 'application/json',
data : JSON.stringify({
idcliente : 'cliente.idcliente',
nome : nome,
email : email,
envio_cobranca : envio_cobranca
}),
success : function(data) {
session = data.session;
}
});
}
</script>
在navigator控制台中,我可以看到:
Request URL: http://localhost:8080/emails/salvar
Request Method: POST
Status Code: 405
Remote Address: [::1]:8080
Referrer Policy: strict-origin-when-cross-origin
所以URL是正确的
按钮代码:
<div class="modal-footer">
<button id="add_email" type="button"
class="btn btn-primary waves-effect waves-light"
th:id="${'addEmail_emails/salvar/' + cliente.id}"
onclick="salvarEmail();">Salvar</button>
这是否与我使用模式有关(当我打开模式时,URL不会改变,保持与此电子邮件方法URL不相关)http://localhost:8080/clientes/cadastrar或者我使用onclick函数而不是表单提交?尝试将
@PostMapping(“/salvar”)
更改为@PostMapping(path=“/salvar”)
尝试将@PostMapping(/salvar”)
更改为@PostMapping(path=“/salvar”)
我认为您需要CSRF令牌。由于Spring安全性,我认为您需要CSRF令牌。由于Spring安全性,请尝试将CSRF令牌和头与POST请求一起发送
function salvarEmail() {
var token = $('#_csrf').attr('content');
var header = $('#_csrf_header').attr('content');
var cliente = /* [[cliente]] */ 0;
var nome = Document.getElementById('nome').value;
var email = Document.getElementById('email').value;
var envio_cobranca = Document.getElementById('envio_cobranca').checked ? true : false;
$.ajax({
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader(header, token);
},
url : "/emails/salvar",
type : 'POST',
contentType : 'application/json',
data : JSON.stringify({
idcliente : 'cliente.idcliente',
nome : nome,
email : email,
envio_cobranca : envio_cobranca
}),
success : function(data) {
session = data.session;
}
});
}
尝试将csrf令牌和标头与POST请求一起发送
function salvarEmail() {
var token = $('#_csrf').attr('content');
var header = $('#_csrf_header').attr('content');
var cliente = /* [[cliente]] */ 0;
var nome = Document.getElementById('nome').value;
var email = Document.getElementById('email').value;
var envio_cobranca = Document.getElementById('envio_cobranca').checked ? true : false;
$.ajax({
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader(header, token);
},
url : "/emails/salvar",
type : 'POST',
contentType : 'application/json',
data : JSON.stringify({
idcliente : 'cliente.idcliente',
nome : nome,
email : email,
envio_cobranca : envio_cobranca
}),
success : function(data) {
session = data.session;
}
});
}
将return“OK”替换为重定向,看看会发生什么。我认为不支持的部分与重定向的URL有关。没有得到…我应该替换return“redirect:/emails/listar”为什么?我还在帖子中添加了一个响应标题信息,似乎只允许get,但我不知道为什么可以在salvar方法中输入?出于某种奇怪的原因,似乎服务器告诉您,对于特定的URL,只支持get方法。查看您从响应中得到的信息。“允许:get”是的,我想我不能进入方法内部。我不知道这个问题是否与模式在具有不同url的页面中打开有关(不是…/电子邮件)发生了一些冲突。我的重点是,我认为错误与重定向字符串有关。我要求您替换它,以查看错误是否会更改。但实际上,我不明白在通过Ajax调用API时为什么要执行重定向。替换返回“OK”使用重定向,看看会发生什么。我认为不受支持的部分与重定向的URL有关。没有得到…我应该替换return“redirect:/emails/listar”为什么?我还在帖子中添加了一个响应标题信息,似乎只允许get,但我不知道为什么可以在salvar方法中输入?出于某种奇怪的原因,似乎服务器告诉您,对于特定的URL,只支持get方法。查看您从响应中得到的信息。“允许:get”是的,我想我不能进入方法内部。我不知道这个问题是否与模式在具有不同url的页面中打开有关(不是…/电子邮件)有些冲突发生了。我的重点是,我认为错误与重定向字符串有关。我让你替换它,看看错误是否会改变。但实际上,我不明白你为什么在通过Ajax调用API时进行重定向。已经尝试过了,但仍然得到相同的错误“@RestController”是用于创建Restful控制器的方便注释。它添加了“@Controller”和“@ResponseBody”注释。它将响应转换为JSON。@Jordy是的,你是对的,RestController在这里没有帮助,更新了应答尝试,没有起作用吗?你是否尝试使用没有方法的RequestMapping注释而不是PostMapping?已经尝试过了,但仍然得到相同的错误“@RestController”是用于创建Restful控制器的方便注释。它添加了“@Controller”和“@ResponseBody”注释。它将响应转换为JSON。@Jordy是的,你是对的,RestController在这里没有帮助,更新了应答尝试,不是吗?你是否尝试使用没有方法的RequestMapping注释而不是PostMapping?如果你也共享代码来支持你在注释中所说的内容,那就更好了。如果tter如果您也共享代码以支持您在评论中所说的内容。非常感谢!它解决了这个特定错误,但现在我得到了错误“jquery.min.js:4 Uncaught TypeError:无法读取未定义的属性'toLowerCase'。非常感谢!它解决了这个特定错误,但现在我得到了错误“jquery.min.js:4未捕获类型错误:无法读取未定义的属性'toLowerCase'。
function salvarEmail() {
var token = $('#_csrf').attr('content');
var header = $('#_csrf_header').attr('content');
var cliente = /* [[cliente]] */ 0;
var nome = Document.getElementById('nome').value;
var email = Document.getElementById('email').value;
var envio_cobranca = Document.getElementById('envio_cobranca').checked ? true : false;
$.ajax({
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader(header, token);
},
url : "/emails/salvar",
type : 'POST',
contentType : 'application/json',
data : JSON.stringify({
idcliente : 'cliente.idcliente',
nome : nome,
email : email,
envio_cobranca : envio_cobranca
}),
success : function(data) {
session = data.session;
}
});
}