Ajax登陆,使用Spring Security缓存跳转到登陆前的链接

Spring Security缓存的应用之登陆后跳转到登录前源地址

什么意思?

  1. 用户访问网站,打开了一个链接:(origin url)起源链接
  2. 请求发送给服务器,服务器判断用户请求了受保护的资源。
  3. 由于用户没有登录,服务器重定向到登录页面:/login
  4. 填写表单,点击登录
  5. 浏览器将用户名密码以表单形式发送给服务器
  6. 服务器验证用户名密码。成功,进入到下一步。否则要求用户重新认证(第三步)
  7. 服务器对用户拥有的权限(角色)判定。有权限,重定向到origin url; 权限不足,返回状态码403( “禁止”)。

从第3步,我们可以知道,用户的请求被中断了。

用户登录成功后(第7步),会被重定向到origin url,spring security通过使用缓存的请求,使得被中断的请求能够继续执行。

具体请看探究Spring Security缓存请求

我这里仅讲解如何在ajax登陆后跳转到登录前的链接。

1. 首先,如果想跳转到登陆之前的链接,我们需要拿到缓存:

SavedRequest savedRequest = requestCache.getRequest(request, response);

注意!若用户是直接访问没有权限限制的登陆页面,是不会有缓存的,也就是说savedRequest = null ,所以在使用缓存之前,我们需要做一个非null判断,也就是:

 if (savedRequest != null) {
        // 逻辑代码
 }

2. 取到登录前访问的url

String url = savedRequest.getRedirectUrl();

3. 使用hashMap建立一个对象,这是为了后续向浏览器返回json数据

 Map json = new HashMap<String, Object>();
            json.put("code", 0);
            json.put("message", "操作成功");
            json.put("url", url);

可以看到这个json 对象比较简单,其中url属性是为了让浏览器端的js跳转的

4.设置响应体编码和格式

response.setContentType(FebsConstant.JSON_UTF8);

5.向浏览器进行响应数据,这里的数据是json格式,是使用jackson工具包完成的,Maven地址:JacksonMaven地址

response.getWriter().write(mapper.writeValueAsString(ResponseBo.ok(messsage, url)));

下面是完整的Java代码:


@Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        // 不管请求哪个页面,登陆成功后仅打开指定页面index
//        redirectStrategy.sendRedirect(request, response, "/index");
        // 获取缓存
        SavedRequest savedRequest = requestCache.getRequest(request, response);
        // 设置响应格式和编码
        response.setContentType(FebsConstant.JSON_UTF8);

        // 缓存非空判断
        if (savedRequest != null) {
            // 跳转到之前引发跳转的url
            String url = savedRequest.getRedirectUrl();

            String messsage = "成功";
            // 准备json
            Map json = new HashMap<String, Object>();
            json.put("code", 0);
            json.put("message", "操作成功");
            json.put("url", url);

            Object jsons = ResponseBo.ok(messsage, url);
            response.getWriter().write(mapper.writeValueAsString(ResponseBo.ok(messsage, url)));
        } else {
            // 这个是没有缓存,直接跳转到默认ajax默认的页面
            response.getWriter().write(mapper.writeValueAsString(ResponseBo.ok()));
        }
    }

6. 前端页面Ajax代码:

    $.ajax(
        {
            type: "post",
            url: "/login",
            // 登陆表单数据序列化
            data: $form.serialize(),
            dataType: "json",
            error: function (data, type, err) {
                if (data.responseJSON != undefined) {
                    console.log(data.responseJSON.error != undefined);
                    console.log(JSON.stringify(data.responseJSON.error));
                    $MB.n_danger("error:" + JSON.stringify(data.responseJSON.error));
                }
            },
            success: function (data) {
                console.log(JSON.stringify(data));
                alert(JSON.stringify(data));

                if (data.code == 0) {
                    // 如果有url,则跳转该url
                    if (data.url != undefined) {
                        $form[0].reset();
                        window.location.href = data.url;
                    } else {
                        // 重置表单的输入框内容
                        $form[0].reset();
                        window.location.href = ‘/index‘;
                        // $form.attr("action", ‘/index‘);
                    }

                } else {
                    // if (r.msg !== ‘验证码不能为空!‘) reloadCode();
                    console.log(data.message);
                }
            },
        }
    );

7.不出意外的话,浏览器会收到下面的数据:

{"code":0,"message":"操作成功"}

如果你也收到了这条数据,说明已经成功了。

原文地址:https://www.cnblogs.com/gobyte/p/10754273.html

时间: 2024-08-26 07:59:10

Ajax登陆,使用Spring Security缓存跳转到登陆前的链接的相关文章

spring security 单一账户多地方登陆提醒, ajax 拦截器 Interceptor

spring-security.xml部分代码: <http auto-config="false" > <access-denied-handler ref="accessDeniedHandler" /> <!-- <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1&quo

Spring Security Session Time Out

最近在用Spring Security做登录管理,登陆成功后,页面长时间无操作,超过session的有效期后,再次点击页面操作,页面无反应,需重新登录后才可正常使用系统. 为了优化用户体验,使得在session失效后,用户点击页面对服务器发起请求时,页面能够自动跳转到登录页面.本次使用spring security 3.1. 第一步:配置spring security的专用配置文件spring-security.xml. <http auto-config="true" entr

Spring Security教程系列(一)基础篇-2

第 4 章 自定义登陆页面 Spring Security虽然默认提供了一个登陆页面,但是这个页面实在太简陋了,只有在快速演示时才有可能它做系统的登陆页面,实际开发时无论是从美观还是实用性角度考虑,我们都必须实现自定义的登录页面. 4.1. 实现自定义登陆页面 自己实现一个login.jsp,放在src/main/webapp/目录下. 4.2. 修改配置文件 在xml中的http标签中添加一个form-login标签. <http auto-config="true">

spring security使用自定义登录界面后,不能返回到之前的请求界面的问题

昨天因为集成spring security oauth2,所以对之前spring security的配置进行了一些修改,然后就导致登录后不能正确跳转回被拦截的页面,而是返回到localhost根目录. 开始以为是被oauth2拦截了导致出了问题,但是security的拦截器是优先起作用的,所以这不可能. 最后实在没法只有打断点调试找毛病(下图为spring security登录后重定向至拦截前访问的url的实现原理流程) 图片是在这里看到的https://blog.csdn.net/zy_coo

session过期后自动跳转到登陆页

项目需要做一个自动登出的功能,查询了网上的资料,一开始准备用session监听做,按照下面方式配置监听器 1.在项目的web.xml文件中添加如下代码: <!--添加Session监听器--> <listener> <listener-class> 监听器路径 </listener-class> </listener> 2.编写java类. public class SessionListener implements HttpSessionLi

spring security 1

首先我们为Spring Security专门建立一个Spring的配置文件,该文件就专门用来作为Spring Security的配置.使用Spring Security我们需要引入Spring Security的NameSpace. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/securit

[转] Spring Security(01)——初体验

[转自:http://haohaoxuexi.iteye.com/blog/2154299] 首先我们为Spring Security专门建立一个Spring的配置文件,该文件就专门用来作为Spring Security的配置.使用Spring Security我们需要引入Spring Security的NameSpace. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security=&quo

Spring security 3.x 普通login与ajax login笔记

原创文章,欢迎转载!转载时务必保留:作者:jmppok ;出处http://blog.csdn.net/jmppok/article/details/44832641 1.问题 在一个Web项目中一般会有两部分组成: 1)静态资源, 如html页面, js脚本,图片等等. 2)API接口. 在进行权限控制时,需要对这两部分进行统一管理. Spring框架本身提供了强大的Security机制,但是在使用过程中还是会出现以下问题: 当用户访问一个页面时,页面本身经常是既包含静态资源,又需要调用API

用spring security实现简单的登陆和权限角色控制

 随笔简介 spring版本:4.3.2.RELEASE+spring security 版本:4.1.2.RELEASE(其它不做说明) 所展示内容全部用注解配置 springmvc已经配置好,不作说明 会涉及到springmvc,spel,el的东西,不熟悉的同学可以先去看一下这方面内容,特别是springmvc 首先想一下,登陆需要什么,最简单的情况下,用户名,密码,然后比对数据库,如果吻合就跳转到个人页面,否则回到登陆页面,并且提示用户名密码错误.这个过程中应该还带有权限角色,并且贯穿整