Spring Security缓存的应用之登岸后跳转到登录前源地点
什么意思?
用户会见网站,打开了一个链接:(origin url)发源链接
请求发送给处事器,处事器判定用户请求了受掩护的资源。
由于用户没有登录,处事器重定向到登录页面:/login
填写表单,点击登录
欣赏器将用户名暗码以表单形式发送给处事器
处事器验证用户名暗码。乐成,进入到下一步。不然要求用户从头认证(第三步)
处事器对用户拥有的权限(脚色)鉴定。有权限,重定向到origin url; 权限不敷,返回状态码403( “克制”)。
从第3步,我们可以知道,用户的请求被间断了。
用户登录乐成后(第7步),会被重定向到origin url,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缓存跳转到登岸前的链接,但愿对各人有所辅佐,假如各人有任何疑问请给我留言,小编会实时回覆各人的。在此也很是感激各人对剧本之家网站的支持!
假如你以为本文对你有辅佐,接待转载,烦请注明出处,感谢!
您大概感乐趣的文章: