Ajax登陆,使用Spring Security缓存跳转到登陆前的链接
Spring Security缓存的应用之登陆后跳转到登录前源地址
什么意思?
- 用户访问网站,打开了一个链接:(origin url)起源链接
- 请求发送给服务器,服务器判断用户请求了受保护的资源。
- 由于用户没有登录,服务器重定向到登录页面:/login
- 填写表单,点击登录
- 浏览器将用户名密码以表单形式发送给服务器
- 服务器验证用户名密码。成功,进入到下一步。否则要求用户重新认证(第三步)
- 服务器对用户拥有的权限(角色)判定。有权限,重定向到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缓存跳转到登陆前的链接的更多相关文章
- spring security简单教程以及实现完全前后端分离
spring security是spring家族的一个安全框架,入门简单.对比shiro,它自带登录页面,自动完成登录操作.权限过滤时支持http方法过滤. 在新手入门使用时,只需要简单的配置,即可实 ...
- spring security 单一账户多地方登陆提醒, ajax 拦截器 Interceptor
spring-security.xml部分代码: <http auto-config="false" > <access-denied-handler ref=& ...
- 浅谈spring security 403机制
403就是access denied ,就是请求拒绝,因为权限不足 三种权限级别 一.无权限访问 <security:http security="none" pattern ...
- Spring Security从后台数据库查询实现登陆控制
Spring Security框架是一个控制登陆的框架,通过配置文件获取后台的用户名及密码,进行比较进行登陆判断 使用步骤 1.导入依赖 <!-- 身份验证 --> <depende ...
- Spring Security教程系列(一)基础篇-2
第 4 章 自定义登陆页面 Spring Security虽然默认提供了一个登陆页面,但是这个页面实在太简陋了,只有在快速演示时才有可能它做系统的登陆页面,实际开发时无论是从美观还是实用性角度考虑,我 ...
- Spring Security Session Time Out
最近在用Spring Security做登录管理,登陆成功后,页面长时间无操作,超过session的有效期后,再次点击页面操作,页面无反应,需重新登录后才可正常使用系统. 为了优化用户体验,使得在se ...
- spring security 4 filter 顺序及作用
Spring Security 有两个作用:认证和授权 一.Srping security 4 filter 别名及顺序 spring security 4 标准filter别名和顺序,因为经常要用就 ...
- spring security使用自定义登录界面后,不能返回到之前的请求界面的问题
昨天因为集成spring security oauth2,所以对之前spring security的配置进行了一些修改,然后就导致登录后不能正确跳转回被拦截的页面,而是返回到localhost根目录. ...
- Spring Security使用心得
某天,你的客户提出这样一个需求,在点击购买商品的时,如果用户没有注册,并且用户没有账号,这时用户去创建账户,然后要直接返回到想购买商品的付款页面.你会该如何基于Spring Security实现? S ...
随机推荐
- GCJ Qualification Round 2016 D题
这题就是找规律.小数据还是挺容易想的.大数据得再深入分析一下. 题意挺绕的. 其实就是字符串转换.字符串只能有两种字母,L或G.给定K和C,就能通过规则生成目标字符串. 那么,如果知道了K和C,以及目 ...
- 在Eclipse中建立Maven Web项目
一.软件版本 Eclipse Java EE IDE for Web Developers. Version: Neon Release (4.6.0) Maven 3.3.9 Servlet 2.5 ...
- Golang RPC 性能测试
Golang RPC 性能测试 | KDF5000 http://kdf5000.com/2017/03/28/Golang-RPC-性能测试/
- ALTER USER USER() IDENTIFIED BY 'password';
[root@test mysql]# bin/mysqld 2018-08-04T14:09:33.831318Z 0 [Warning] [MY-011070] [Server] 'Disablin ...
- iOS开发隐藏键盘方法总结
以下为大家带来我整理总结的几种隐藏键盘的方法. 一.隐藏自身软键盘 当对于有多个UITextField控件都想通过点击"Return"来隐藏自身软键盘的情况,这时的最好办法是使用D ...
- vim实现代码缩进和可视区域的字符串替换
今天2014年9月12号,实现了vim下的代码自动缩进和替换可视区域的字符串,之前一直在用vim这个强大的编辑器,它的强大只有用了的人才知道,现在把这两个很强大的功能展示出来,有个这两个功能,即使你写 ...
- Ubuntu增加Swap分区大小
参考:http://blog.csdn.net/mznewfacer/article/details/7334592 以下摘自上述地址内容,并做了点小修改: 1.首先用命令free查看系统内 Swap ...
- Gym - 100187E E - Two Labyrinths —— bfs
题目链接:http://codeforces.com/gym/100187/problem/E 题解:一开始做的时候是将两幅图合并,然后直接bfs看是否能到达终点.但这种做法的错的,因为走出来的路对于 ...
- linux应用之yum命令详解
linux yum命令详解 yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理,能 ...
- 确定mapkeeper使用的leverdb库路径
目前libleveldb的a或so库有三个路径,/usr/lib, /usr/lib/x86_64-linux-gnu , /usr/local/lib 使用 ls -d -1 /usr/lib/* ...