当我尝试使用我的jsp中的spring mvc和ajax尝试更新数据库中的数据时,我在控制台中得到了这个。
http://localhost:8080/my_project/activerutilisateur/user 405 (Méthode Non Autorisée)
请参阅下面的代码:
DAO
public Utilisateur updateUtilisateur(Utilisateur utilisateur) {
sessionFactory.getCurrentSession().update(utilisateur);
return utilisateur;
}
控制器
@RequestMapping(value="/activerutilisateur/{username}", method=RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Utilisateur activerUtilisateur(@PathVariable String username, @RequestBody Utilisateur utilisateur) {
utilisateur = service.getUtilisateurById(username);
utilisateur.setEnable(true);
return service.updateUtilisateur(utilisateur);
}
Ajax请求
<script>
function activerUtilisateur(username) {
var user = {"username" : username}
$.ajax({
contentType: 'application/json',
type: 'POST',
url: 'activerutilisateur/',
data : JSON.stringify(user),
error: function(xhr,error,textStatus){
console.log(textStatus);
},
complete: function(data) {
console.log(data);
console.log('complete done');
},
success: function(data) {
alert('success done');
}
});
}
</script>
这是唯一不在项目中工作的方法
有人可以帮我找到我做错的事吗?
由于
答案 0 :(得分:1)
您的控制器是POST
方法,但您正在读取pathVariable而不是任何请求正文,通常在POST
调用中您需要将Payload发送到您的控制器。在Ajax中,你正在传递
url: 'activerutilisateur/'+username
----&gt; for PathVariable
data: {'username' : username}
----&gt; Controller中没有requestBody用于此有效负载。
您应该更新控制器以将请求正文作为参数。
编辑:我在代码下运行,并且在本地计算机上运行正常
JSP / JS代码:
<script>
function activerUtilisateur(username) {
var user = {
"username" : username
}
$.ajax({
contentType: 'application/json',
type: 'POST',
url: 'activerutilisateur/',
data : JSON.stringify(user),
error: function(data){
console.log('Motif erreur : '+data);
},
complete: function(data) {
console.log('complete done');
},
success: function(data) {
console.log('success done');
}
});
}
</script>
控制器代码:
@RequestMapping(value = "/activerutilisateur/", method = RequestMethod.POST)
@ResponseBody
public Utilisateur activerUtilisateur(@RequestBody Utilisateur user) {
service.activerUtilisateur(username);
return user;
}
型号代码:
public class Utilisateur {
private String username ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
此外,您似乎已启用了csrf保护,因此请检查Sending CSRF Token from JS是否在对控制器的调用中发送csrf令牌。
答案 1 :(得分:1)
我终于找到了错误:
https://matthewbusche.com/blog2/2016/08/06/using-csrf-with-spring-security-and-ajax-calls/
由于csrf
答案 2 :(得分:0)
我想这是你的Utilisateur模型类:
public class Utilisateur {
private String username ;
// getter & setter
}
在您的控制器中:
@RequestMapping(value="/activerutilisateur/", method=RequestMethod.POST)
@ResponseBody
public Utilisateur activerUtilisateur(@RequestBody Utilisateur user) {
return service.activerUtilisateur(user.getUsername());
}
在您的Ajax呼叫中:
<script type="text/javascript">
function activerUtilisateur(username){
var user = {
"username" : username
}
$.ajax({
type: 'POST',
url: 'activerutilisateur/',
data : JSON.stringify(user)
error: function(xhr, error, textStatus){
console.log('Motif erreur : '+textStatus);
},
success:function(data){
console.log(data);
}
});
}
</script>