项目场景:
设置了loginProcessingUrl(“/toLogin”),不走controller的(“/toLogin”)逻辑
问题描述
通过debug发现,在设置了loginProcessingUrl(“/toLogin”)之后,实际登陆认证时不会跳转到(自己写的/toLogin)controller里面,而是进入springsecurity框架里面,从框架里面代码中,完成了验证和跳转(验证不会使用自己定义的login方法),这一动作不执行对应controller里面的代码。认证成功之后,一般会重新进入登陆之前 要进入的页面接口(Referer 来源页面),继续执行
图中最开始要进入的网址:http://localhost:8080/8
,被框架拦截,进入登陆认证页面/toLogin
,认证成功之后会放行,也就是继续执行http://localhost:8080/8
该接口controller的内容
基础知识:
defaultSuccessUrl和successForwardUrl区别
defaultSuccessUrl 有一个重载的方法,如果我们在 defaultSuccessUrl 中指定登录成功的跳转页面为 /index,此时分两种情况,如果你是直接在浏览器中输入的登录地址,登录成功后,就直接跳转到 /index,如果你是在浏览器中输入了其他地址,例如 http://localhost:8080/8,结果因为没有登录,又重定向到登录页面,此时登录成功后,就不会来到 /index ,而是来到 /8 页面。
defaultSuccessUrl 就是说,它会默认跳转到 Referer 来源页面,如果 Referer 为空,没有来源页,则跳转到默认设置的页面。
successForwardUrl 表示不管你是从哪里来的,登录后一律跳转到 successForwardUrl 指定的地址。
defaultSuccessUrl 另外一个重载方法,第二个参数如果输入为 true,则效果和 successForwardUrl 一致。
successForwardUrl 指定的地址为 /index ,你在浏览器地址栏输入 http://localhost:8080/codedq,如果你还没有登录,将会重定向到登录页面,当你登录成功之后,就会服务端跳转到 /index 页面;或者你直接就在浏览器输入了登录页面地址,登录成功后也是来到 /index。
解决方案:
两种方案
有两种方式:
- 设置loginProcessingUrl,defaultSuccessUrl,不走controller
- springsecurityConfig配置类不设置,通过走controller
方法1:
.formLogin(form -> form.loginPage("/toLoginPage")
//处理前端跳转页面,要跟form表单里的action相同
.loginProcessingUrl("/toLogin")
.defaultSuccessUrl("/success",true)
.passwordParameter("pwd")
.usernameParameter("username"))
通过配置.loginProcessingUrl("/toLogin")
,进入框架进行认证,认证结束后按照设置进入指定页面"/success"
方法2:
@RequestMapping ("/toLogin")
public String toLogin(@RequestParam String username,
@RequestParam String pwd){
//调用自定义的login认证逻辑
String login = userService.login(username, pwd);
return "success";
}
<form th:action="@{/toLogin}" method="post">
<div>
<label> User Name : <input type="text" name="username"/> </label>
<label> pwd: <input type="password" name="pwd"/></label>
</div>
<!-- 是否选择了记住我按钮-->
<div><input type="checkbox" value="remember"/></div>
<div><input type="submit" value="Sign In"/></div>
</form>
配置类中不要设置loginProcessingUrl("/toLogin")
,就会走到@RequestMapping ("/toLogin")
controller中执行自己的逻辑