首页 > 其他分享 >自定义登录和登出页面

自定义登录和登出页面

时间:2024-04-22 15:55:22浏览次数:12  
标签:map 自定义 登录 登出 json put new 页面

自定义登录

在默认的情况下,Spring Security为我们生成的登录登出页面如下:


我们可以自定义登录和登出页面,我们使用thymeleaf来编写登录页面,代码如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Please Log In</title>
</head>
<body>
<h1>Please Log In</h1>
<form th:action="@{/login}" method="post">
    <div>
        <input type="text" name="username" placeholder="Username"/>
    </div>
    <div>
        <input type="password" name="password" placeholder="Password"/>
    </div>
    <input type="submit" value="Log in" />
</form>
</body>
</html>

配置自定义登录相关设置:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    // 认证相关
    http.authorizeRequests(authorize ->
                           authorize
                           // /login.html请求不需要验证
                           .requestMatchers(new AntPathRequestMatcher("/login")).permitAll()
                           .anyRequest()
                           .authenticated()
                          );

    // 开启登录表单
    http.formLogin(form -> {
        form
            // 自定义登录页面
            .loginPage("/login")
            // 自定义登录URL
            .loginProcessingUrl("/login")
            // 登录成功之后跳转的页面
            .defaultSuccessUrl("/index")
            .permitAll();
    });

    // 关闭csrf防护
    http.csrf().disable();

    return http.build();
}


登录成功之后跳转页面:

在现在的项目开发过程中,一般都是前后端分离的项目,后端只需要返回JSON数据,由前端自己进行跳转,那么我们可以进行如下配置:

// 开启登录表单
http.formLogin(form -> {
    form
        // 自定义登录页面
        .loginPage("/login")
        // 自定义登录URL
        .loginProcessingUrl("/login")
        // 用于前后端分离的情况,登录成功之后返回JSON数据
        .successHandler(new AuthenticationSuccessHandlerImpl())
        // 用于前后端分离的情况,登录失败之后返回JSON数据
        .failureHandler(new AuthenticationFailureHandlerImpl())
        .permitAll();
});

上面分别配置了登录成功返回的JSON和登录失败的JSONAuthenticationSuccessHandlerImpl,AuthenticationFailureHandlerImpl分别实现Spring Security提供的接口AuthenticationSuccessHandler,AuthenticationFailureHandler

public class AuthenticationSuccessHandlerImpl implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        Map<String,Object> map = new HashMap<>();
        map.put("code", "200");
        map.put("message", "成功");
        map.put("data", authentication);
        String json = new ObjectMapper().writeValueAsString(map);

        // 构建返回
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().println(json);
    }
}
public class AuthenticationFailureHandlerImpl implements AuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {

        Map<String,Object> map = new HashMap<>();
        map.put("code", "-1");
        map.put("message", "登录失败");
        map.put("data", exception.getLocalizedMessage());

        String json = new ObjectMapper().writeValueAsString(map);
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().println(json);
    }
}

使用Postman测试:

自定义登出

// 登出表单
http.logout(logout -> {
    logout
        // 自定义登出地址
        .logoutUrl("/logout").
        // 用户前后端分离登出返回JSON
        logoutSuccessHandler(new LogoutSuccessHandlerImpl());
});

实现LogoutSuccessHandler接口:

public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        Map<String,Object> map = new HashMap<>();
        map.put("code", "200");
        map.put("message", "注销成功");
        map.put("data", authentication.getName());
        String json = new ObjectMapper().writeValueAsString(map);

        response.setContentType("application/json;charset=utf-8");
        response.getWriter().println(json);
    }
}

标签:map,自定义,登录,登出,json,put,new,页面
From: https://www.cnblogs.com/wyzstudy/p/18150785

相关文章

  • Java集成系列:高效构建自定义插件
    前言随着软件开发的快速发展和需求的不断增长,开发人员面临着更多的压力和挑战。传统的开发方法需要花费大量的时间和精力,而低代码开发平台的出现为开发人员提供了一种更加高效、快速的开发方式。今天小编就以构建命令插件为例,展示如何使用Java语言高效构建自定义插件。环境准备......
  • 前端页面渲染(文档+数据)不同模式
    一张可被用户访问的页面,可以被拆分为主文档(html)和数据两个部分,这两个部分既可以是组合在一起的(SSR),也可以是分离的(SPA、异步渲染)。比如一些活动搭建平台,可以增加一个数据网关,实现SSR,提升用户体验。服务端渲染(Server-SideRendering,SSR)服务端渲染是一种在服务器上生成完整......
  • vis.js自定义轴
    代码案例<!doctypehtml><html><head><title>Timeline</title><scripttype="text/javascript"src="https://unpkg.com/vis-timeline@latest/standalone/umd/vis-timeline-graph2d.min.js"></script>......
  • sublime text添加自定义代码片段
    效果展示建立步骤如图新建代码片段填写内容xml的标签形式。tabTrigger和vscode内的prefix一样,就是触发提示的代码。<![CDATA[内部既是我们要的代码。${1:}表示光标首先停在的位置${1:xxx}即表示默认文字为xxx,如果是${2:}则按一下tab就跳到2的位置。description表......
  • 自定义视频神器,《小星星去重播放器》助您轻松解决视频画面重复问题,让您的无人直播更稳
    你是否还在靠剪辑来去重视频?是否还在通过手动点击来进行循环播放?是否还在通过拼接来增加视频时长?快来看看这款只需要简单的设置就能对视频进行全面去重,专为企业展播和无人直播设计的工具——《小星星去重播放器》!视频播放打开已保存的第一个视频/视频管理里添加需要修改的视频......
  • 毕业设计/毕业论文中的题注样式问题——基于自定义样式章节号的题注
    问题:在为毕业设计论文中的图表插入题注时,使用word自带的“包含章节号”功能时,无法选择自定义样式,或随便选一个起始样式导致“错误!文档中没有指定样式的文字”。解决方案:步骤如下随便插入题注:右键选中图表>插入题注>编号>包含章节号查看域代码:右键>切换域代码更改域......
  • WPF自定义控件,如何使得xaml涉及器中的修改能立即反应到预览
    这是我无意中发现的,xaml中设置的是依赖属性而不是包装器,所以我们可以直接在注册依赖属性那里设置回调,触发某个控件重绘,比如本身或父控件重绘。xaml设计器就会实时更新1//!!!由于xaml解析是直接通过这里进行的,不通过包装器,所以通过设置这里的回调,可以使得在编辑xaml自定义依赖......
  • 微信小程序页面功能-----标签切换
    一、页面布局首先我们需要布局出标签切换的页面,下面不多描述直接上代码1、html部分<!--标签页标题--><viewclass="tob"><viewclass="tab-item">音乐推荐器</view><viewclass="tab-item">播放器</view><viewclass="tab-item&quo......
  • 原生js图片截取并渲染页面
    一、将海报大图截屏部分图片并渲染页面二、实现代码如下<!DOCTYPEhtml><htmllang="zh"> <head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width,initial-scale=1.0"> <title>Do......
  • 模拟在页面点击导入csv
    案例背景组件性能测试过程中,要导入大量自定义的数据。案例分析本案例中采用python的pandas库,模拟了生成导入csv文件,模拟在页面点击导入csv,使文件导入更高效。实现方案1****、在前端页面解析内部接口参数典型的导入流程至少包含上传文件和确认上传。上传文件在浏览......