我正在尝试使用HTML表单将数据提交到我的Spring / Thymeleaf服务器。当我使用POST方法提交时,第二个请求将使用相同的URL发送,但带有附加的“?error”查询参数和GET方法。此后续请求导致错误,因为它不携带POST请求主体中存在的信息,并且我必须以某种方式处理此第二个请求。在我的检查器窗口中,它说第二个请求是由第一个请求以某种方式发起的。
将方法更改为GET后,请求可以正常工作。但是,此解决方案对我不起作用,因为我正在使用表单提交密码数据。
以下是引起问题的形式(省略了类等):
<form action="/login" method="POST">
<div>
<div>
<span><i></i></span>
</div>
<input name="username" type="text" placeholder="username">
</div>
<div>
<div>
<span><i></i></span>
</div>
<input name="password" type="password" placeholder="password">
</div>
<input type="hidden" th:value="${_csrf.token}" th:name="${_csrf.parameterName}">
<div>
<input type="submit" value="Login" name="button">
</div>
</form>
这是处理/ login所有请求的控制器(这尚未完成,但是可能我在这里缺少了一些必要的东西):
@Controller()
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String doGet() {
System.out.println("Login page accessed");
return "login";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String doPost() {
System.out.println("Login attempted");
return "redirect:home";
}
}
提交表单时预期的输出是“尝试登录”,但唯一的结果是“已访问登录页面”。
这里是安全配置方法,为该终结点明确定义了一些额外的功能
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/about", "/login", "/css/**", "/js/**", "/assets/**" ).permitAll()
.anyRequest().permitAll()
.and()
.csrf()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/login")
.defaultSuccessUrl("/home")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutUrl("/logout")
.addLogoutHandler( new CookieClearingLogoutHandler() );
}
第一个请求似乎甚至没有到达控制器。如何避免发送第二个请求?
答案 0 :(得分:0)
每次登录失败时,Spring Security都会启动额外的session_start();
/**
* Your authentication logic here
* Which for example returns a uid of 1
*/
$_SESSION['ssid'] = \Firebase\JWT\JWT::encode((object) ['uid' => 1], 'your_key');
调用。这是默认的表单登录名session_start();
header('Content-Type: application/json');
if(!isset(($bearer =& $_SESSION['ssid'])))
die(json_encode(['error' => 403])); // Forbidden
try {
$user = \Firebase\JWT\JWT::decode($bearer, 'your_key', array('HS256'));
// Your logic
// $user->uid to get the ID
} catch (Exception $e) {
// Handle exceptions where the bearer has either expired or is invalid
}
。
Spring Security具有默认的(function ($) => {
$.get('/getData', (response) => {
// Logic
});
})(JQuery);
POST处理程序,并且您的代码可能与之冲突(即,您的表单发布数据将转到Spring Security的处理程序而不是您的处理程序,然后在此处验证失败并导致重定向到错误)。
您可能想签出spawn
和exec
。