sessionStorage记录返回前端的数据,用于解决登录拦截器刷新页面的问题
1.问题出现的场景与解决
实现一个登录拦截器,重写doFilter方法,判断用户的登录状态,在用户长时间未操作或者异地登录时前端进行提示,完整代码如下
public class LoginValidateFilter implements Filter {
private String errorMessage;
private Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String url = request.getRequestURI();
if (isResourceRequest(url)
|| isNotLoginValidate(url, request)) {
chain.doFilter(servletRequest, servletResponse);
return;
}
//判断用户是否在登录状态
if (isLogin(request, response)) {
//更新session时间:心跳检测的请求不更新
if (url.indexOf("/manage/session/isAlive.do") < 0) {
SessionUtil.updateSession(request);
}
chain.doFilter(servletRequest, servletResponse);
} else {
SessionUtil.removeSession(request);
String path = request.getContextPath();
response.setContentType("text/html");
// String responsePage = "<script>document.location.href='" + path + "/login.jsp" + (StringUtil.isEmpty(errorMessage)
// ? "'" : "?errorMessage='+encodeURIComponent ('" + errorMessage + "')") + "</script>";
String responsePage = "<script>document.location.href='" + path + "/login.jsp" + "';window.sessionStorage.setItem('errorMessage','"+errorMessage+"');"+ "</script>";
response.getWriter().print(responsePage);
}
} catch (Exception e) {
log.error("登录过滤器异常:{}", e);
throw new ServletException(e);
}
}
private boolean isLogin(HttpServletRequest request, HttpServletResponse response) {
Session session = SessionUtil.getSession(request);
//未登录
if (session == null) {
errorMessage = "";
Session oldSession = SessionUtil.getOldSession(request);
if (oldSession != null) {
errorMessage = "您的账号在异地登录(" + oldSession.getIp() + "),如非授权,建议修改密码";
}
return false;
}
//登录超时
if (SessionUtil.isLoginTimeout(session)) {
SessionUtil.removeSession(session);
errorMessage = "因长时间未操作,系统已自动退出,请重新登录";
return false;
}
return true;
}
/**
* 不用过滤的额外配置
* 没有登录时,有些请求是必须的,因此不用过滤
*
* @param url
* @param request
* @return
*/
private boolean isNotLoginValidate(String url, HttpServletRequest request) {
for (String path : GridProperties.NOT_VALIDATE_PATH) {
if (url.startsWith(request.getContextPath() + path)) {
return true;
}
}
return false;
}
/**
* 资源请求
*
* @param url
* @return
*/
private boolean isResourceRequest(String url) {
if (url.endsWith(".jpg") || url.endsWith(".gif")
|| url.endsWith(".css") || url.endsWith(".js")
|| url.endsWith(".png") || url.endsWith(".bmp")
|| url.endsWith(".ico") || url.endsWith(".txt")
|| url.endsWith(".apk") || url.endsWith("bootstrap.min.css.map")) {
return true;
}
return false;
}
@Override
public void destroy() {
this.errorMessage = "";
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.errorMessage = "";
}
}
第30-31行返回给前端返回提示信息,通过url进行传参进行提示,前端页面再进行获取,往往会出现乱码和刷新页面数据还在的问题,
考虑通过后端方式给前端传回数据 都没有成功。
最后通过使用sessionStorage进行传递参数,问题解决。
前端的主要处理代码如下
console.log(window.sessionStorage.getItem('errorMessage'));
var message = window.sessionStorage.getItem('errorMessage');
if (message !=null) {
$(".login-errorMsg").text(message);
window.sessionStorage.removeItem("errorMessage");
}else {
$(".login-errorMsg").text("");
}
2.认识sessionStorage
通过浏览器的F12 我们可以看到如下界面

可以看到我们可以使用localStorage 和sessionStorage来存储前端交互数据
sessionStorage简单的存取和读取方式如下:
sessionStorage.setItem('testKey','这是一个测试的value值'); // 存入一个值
window.sessionStorage.getItem('key'); //取出一个值
sessionStorage.removeItem("key");//删除某个key
sessionStorage.clear();//清除所有key/value
可以大胆推断一下,localStorage 的使用方式应该也是类似的,
具体的使用方法可以参考:https://www.cnblogs.com/polk6/p/5512979.html
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/sessionStorage
https://www.cnblogs.com/minigrasshopper/p/8064367.html
sessionStorage记录返回前端的数据,用于解决登录拦截器刷新页面的问题的更多相关文章
- 解决SpringMVC拦截器中Request数据只能读取一次的问题
解决SpringMVC拦截器中Request数据只能读取一次的问题 开发项目中,经常会直接在request中取数据,如Json数据,也经常用到@RequestBody注解,也可以直接通过request ...
- spring controller获取web前端post数据乱码解决
web.xml文件加上如下代码<!-- post请求乱码拦截器 --><filter> <filter-name>CharacterEncodingFilter&l ...
- 解决Ajax.BeginForm还是刷新页面的问题
在.net mvc中用Ajax.BeginForm来实现异步提交,在Ajax.BeginForm里面还是可以用submit按钮,一般来说 submit按钮是提交整个页面的数据.但是在Ajax.Begi ...
- 解决Struts2拦截器的对于参数传递无效问题
今天做项目时,使用拦截器对用户权限检查.拦截器本身没有问题,可是实现权限拦截,但是传递的参数全部都无效了.搞了很久,由于对拦截器的内部机制不是特别熟悉,所以重新研读了一下Struts2的拦截器.找到了 ...
- 解决mybatis拦截器无法注入spring bean的问题
公司要整合rabbitmq与mybatis拦截器做一个数据同步功能. 整合过程中大部分环节都没什么问题,就是遇到了mybatis拦截器 @Intercepts(@Signature(type = Ex ...
- Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法
如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable. 在实现 ...
- orm 查询数据库随机返回一条数据的解决办法用models.User.objests.all().order_by('?').first()
- 解决SpringMVC拦截器拦截静态资源的问题。
在使用SpringMVC进行开发的时候,遇到了以下代码不能执行的情况.而且我已经正确导入了JQuery框架. <script type="text/javascript"&g ...
- Vue-Cli3.0 单页面如何预渲染,解决登录拦截导致无法部分路由无法预渲染问题?
vue单页面不利于seo,如何解决已有spa项目seo问题? 1.安装 cnpm install prerender-spa-plugin --save-dev 2.路由history模式 const ...
随机推荐
- nginx并发模型与traffic_server并发模型简单比较
ginx并发模型: nginx 的进程模型采用的是prefork方式,预先分配的worker子进程数量由配置文件指定,默认为1,不超过1024.master主进程创建监听套接口,fork子进程以后,由 ...
- WPF PrismDialog PopupWindowAction使用MetroWindow
本示例必须在prism5.0版本以上 PopupWindowAction如何使用MetroWindow? public class Window1ViewModel:BindableBase,II ...
- 2019-4-22 jdbc学习笔记
jdbc 一.定义:java database connector 二.常用的接口 java.sql.Driver 驱动 java.sql.Connection 链接 java.sql.State ...
- Mac 安装微软雅黑字体
https://www.jianshu.com/p/d8c34fff3483 1.找一台Windows电脑,打开字体文件夹C:\Windows\Fonts. 2.搜索"Calibri.微软雅 ...
- Java匹马行天下之JavaSE核心技术——面向对象
面向对象 注: 看此篇时强烈建议有一定的面向对象思想基础,有一定的基础后先翻到下面看第九条: 9.面向对象: 从未封装→封装→继承→多态→抽象类→接口的代码演变 按这个逻辑去看,,哪有不理解 ...
- 影响 POST 请求文件上传失败的几个环节的配置(php + nginx)
写在前面 最近写一个 php 接口,接受上传的文件,发现文件只要超过 5m 以上就会无响应失败,最后发现是 shadowsocks 的 timeout 设置问题(我全程开了全局的 VPN),但一开始并 ...
- ASP.NET Web API实现微信公众平台开发(三)自定义菜单
承接之前的流程,在完成服务器绑定和获取access_token之后,本文主要讲述如何实现微信自定义菜单. 官方示例效果 开始之前 .自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. ...
- IOS 数据存储之 Core Data详解
Core Date是ios3.0后引入的数据持久化解决方案,它是是苹果官方推荐使用的,不需要借助第三方框架.Core Date实际上是对SQLite的封装,提供了更高级的持久化方式.在对数据库操作时, ...
- [EXP]phpBB 3.2.3 - Remote Code Execution
// All greets goes to RIPS Tech // Run this JS on Attachment Settings ACP page var plupload_salt = ' ...
- __getattr__()
定义了__getattr__(),当访问object不存在的属性时会调用该方法 不定义访问不存在的属性时会报 AttributeError eg: class Cat(object): def __i ...