参考上文,我们对security的登录成功和失败进行了配置跳转页面,但是这种情况只能针对于前后端不分离的情况
如果遇到了前后端分离的情况下,我们就必须对其进行前后端分离的配置,只需要返回json格式的数据即可
无状态登录
了解什么是无状态登录,什么是有状态登录
有状态登录就是默认的cookie/session进行存储的方式
无状态登录就是jwt的token登录
1、登录交互
前后端数据交互
使用successHandler替代之前的successForwardUrl和defaultSuccessUrl
.successHandler((req, resp, auth) -> {//auth: 当前登录成功的用户信息
resp.setContentType("application/json;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write(new ObjectMapper().writeValueAsString(auth.getPrincipal()));
writer.flush();
writer.close();
})
.failureHandler((req, resp, exception) -> {
resp.setContentType("application/json;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write(new ObjectMapper().writeValueAsString(exception.getMessage()));
writer.flush();
writer.close();
})
登陆成功后不再进行跳转页面,而是返回json数据,由前端进行决定是否跳转
结果
成功 | |
---|---|
失败 | |
对于失败处理器来说,我们可以根据返回的异常类型不同,设置不同的异常信息
可以将成功处理和失败处理单独提出成为单独的Handler类
2、未认证处理方案
未登录状态下访问需要登录认证后才能访问的接口,则需要返回特定的信息
.exceptionHandling().authenticationEntryPoint((req, resp, exception) -> {
resp.setContentType("application/json;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write(new ObjectMapper().writeValueAsString("尚未登录,请先登录!"));
writer.flush();
writer.close();
});
3、注销登录
.logoutSuccessHandler((req, resp, exception) -> {
resp.setContentType("application/json;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write(new ObjectMapper().writeValueAsString("注销登录成功"));
writer.flush();
writer.close();
})
这些处理都可以扩展出更丰富的处理类