• 这个问题由来已久啊,从前后端交互开始就碰到这个问题,当然这个原因是因为Spring Security在默认情况下开启了防CSRF(跨站点请求伪造)
  • 解决:

1. 关闭CSRF

().disable().authorizeRequests();

关闭CSRF过滤器的验证会给网站带来一定被攻击的风险,因此大部分情况下,都不建议关闭这个功能.

2. 开启CSRF

那么对于不关闭CSRF的Spring Security,每次HTTP请求的表单(FORM)就要求存在CSRF参数.当访问表单时,Spring Security就会生成CSRF参数,放进表单中,这样当提交表单到服务器时,就要求连同CSRF表单一起提交服务器.SPring Security就会对CSRF参数进行判断,判断是否与其生成的保持一致.如果一致(和验证码差不多啊),他就不会人为该请求来自CSRF攻击;如果CSRF参数为空或者与服务器的不一致,他就人为这是一个来自CSRF的攻击而拒绝请求.因为这个参数不再cookie中,所以第三方网站是无法伪造的(重点不再Cookie中),这样就可以避免CSRF攻击,具体在Spring Boot中还是使用thymeleaf来写表单,因为JSP不好用

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<title>Confirm Log Out?</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
<link href="https://getbootstrap.com/docs/4.0/examples/signin/signin.css" rel="stylesheet" crossorigin="anonymous"/>
</head>
<body>
<div class="container">
<form class="form-signin" method="post" action="/logout2">
<h2 class="form-signin-heading">Are you ssssure you want to log out?</h2>
<input th:name="${_csrf.parameterName}" type="hidden" th:value="${_csrf.token}" />
<button class="btn btn-lg btn-primary btn-block" type="submit">Log Out</button>
</form>
</div>
</body>
</html>

这是登出界面的例子