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缓存跳转到登岸前的链接,但愿对各人有所辅佐,假如各人有任何疑问请给我留言,小编会实时回覆各人的。在此也很是感激各人对剧本之家网站的支持!
假如你以为本文对你有辅佐,接待转载,烦请注明出处,感谢!

您大概感乐趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdfyw.html