参考上文,我们对security的登录成功和失败进行了配置跳转页面,但是这种情况只能针对于前后端不分离的情况
如果遇到了前后端分离的情况下,我们就必须对其进行前后端分离的配置,只需要返回json格式的数据即可

无状态登录

了解什么是无状态登录,什么是有状态登录
有状态登录就是默认的cookie/session进行存储的方式
无状态登录就是jwt的token登录

1、登录交互

前后端数据交互

使用successHandler替代之前的successForwardUrl和defaultSuccessUrl

  1. .successHandler((req, resp, auth) -> {//auth: 当前登录成功的用户信息
  2. resp.setContentType("application/json;charset=utf-8");
  3. PrintWriter writer = resp.getWriter();
  4. writer.write(new ObjectMapper().writeValueAsString(auth.getPrincipal()));
  5. writer.flush();
  6. writer.close();
  7. })
  8. .failureHandler((req, resp, exception) -> {
  9. resp.setContentType("application/json;charset=utf-8");
  10. PrintWriter writer = resp.getWriter();
  11. writer.write(new ObjectMapper().writeValueAsString(exception.getMessage()));
  12. writer.flush();
  13. writer.close();
  14. })

登陆成功后不再进行跳转页面,而是返回json数据,由前端进行决定是否跳转

结果

成功 image.png
失败 image.png

对于失败处理器来说,我们可以根据返回的异常类型不同,设置不同的异常信息
可以将成功处理和失败处理单独提出成为单独的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();
            });

image.png

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();
                })

image.png

这些处理都可以扩展出更丰富的处理类