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":"操作成功"}

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

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

  1. spring security简单教程以及实现完全前后端分离

    spring security是spring家族的一个安全框架,入门简单.对比shiro,它自带登录页面,自动完成登录操作.权限过滤时支持http方法过滤. 在新手入门使用时,只需要简单的配置,即可实 ...

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

    spring-security.xml部分代码: <http auto-config="false" > <access-denied-handler ref=& ...

  3. 浅谈spring security 403机制

    403就是access denied ,就是请求拒绝,因为权限不足 三种权限级别 一.无权限访问 <security:http security="none" pattern ...

  4. Spring Security从后台数据库查询实现登陆控制

    Spring Security框架是一个控制登陆的框架,通过配置文件获取后台的用户名及密码,进行比较进行登陆判断 使用步骤 1.导入依赖 <!-- 身份验证 --> <depende ...

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

    第 4 章 自定义登陆页面 Spring Security虽然默认提供了一个登陆页面,但是这个页面实在太简陋了,只有在快速演示时才有可能它做系统的登陆页面,实际开发时无论是从美观还是实用性角度考虑,我 ...

  6. Spring Security Session Time Out

    最近在用Spring Security做登录管理,登陆成功后,页面长时间无操作,超过session的有效期后,再次点击页面操作,页面无反应,需重新登录后才可正常使用系统. 为了优化用户体验,使得在se ...

  7. spring security 4 filter 顺序及作用

    Spring Security 有两个作用:认证和授权 一.Srping security 4 filter 别名及顺序 spring security 4 标准filter别名和顺序,因为经常要用就 ...

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

    昨天因为集成spring security oauth2,所以对之前spring security的配置进行了一些修改,然后就导致登录后不能正确跳转回被拦截的页面,而是返回到localhost根目录. ...

  9. Spring Security使用心得

    某天,你的客户提出这样一个需求,在点击购买商品的时,如果用户没有注册,并且用户没有账号,这时用户去创建账户,然后要直接返回到想购买商品的付款页面.你会该如何基于Spring Security实现? S ...

随机推荐

  1. 安卓Android手机直播推送同步录像功能设计与实现源码

    本文转自:http://blog.csdn.net/jyt0551/article/details/58714595 EasyPusher是一款非常棒的推送客户端.稳定.高效.低延迟,音视频同步等都特 ...

  2. XML 解析错误:找不到根元素

    大家在开发web项目的过程中,可能会遇到“XML 解析错误:找不到根元素”这么一个问题,引起这个问题的原因可能有很多种,在这儿我只是跟大家分享一下我遇到一种情况. 1.项目背景描述 extjs 结合a ...

  3. JAVA工厂方法模式(Factory Method)

    1.普通工厂模式 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建. 1-1.建立Sender接口 public interface Sender { public void ...

  4. (深入理解计算机系统)AT&T汇编指令

    AT&T汇编指令学习(GCC) 寄存器命名原则: 相比inter语法,AT&T语法格式要求所有的寄存器都必须加上取值符"%". 操作码命令格式: 源/目的操作数顺序 ...

  5. Ubuntu Linux系统环境变量配置文件【转】

    本文转载自:https://my.oschina.net/qinlinwang/blog/30471 Ubuntu Linux系统环境变量配置文件:  /etc/profile : 在登录时,操作系统 ...

  6. Android-Universal-Image-Loader使用介绍

    简介 Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你.Universal Image Loader for Android的目的 ...

  7. Linux删除乱码非空目录

    # ls -li 总用量 drwxr-xr-x root root 2月 : 2.1 -rw-rw-r-- binwen binwen 2月 : Htc_常用软件.zip drwxr-xr-x roo ...

  8. MySQL丨分页查询

    直奔主题 一.sql语句:select * from table limit startPageNum,everyPageNum 1)语句解析: table:你要查询的表 startPageNum:从 ...

  9. MAC 安装phantomjs

    step1:下载压缩包http://phantomjs.org/ step2:解压缩,我是解压缩到/Users/gxy/software step3:写入配置路径,vi ~/.bash_profile ...

  10. C语言文件读写总结

    主要有四种: 1.文件的字符输入输出函数 fgetc fputc2.文件的字符串输入输出函数 fgets fputs3.文件的格式化输入输出函数 fscanf fprintf4.文件的数据块输入输出函 ...