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 ...
随机推荐
- MVC 5使用TempData Object跨视图传递数据
经过一系列显示数据的练习:<MVC 5使用ViewData(对象)显示数据>http://www.cnblogs.com/insus/p/3377178.html<MVC 5使用Vi ...
- Vue 父组件ajax异步更新数据,子组件props获取不到
转载 https://blog.csdn.net/d295968572/article/details/80810349 当父组件 axjos 获取数据,子组件使用 props 接收数据时,执行 mo ...
- 选项卡--原生js
比较基础的一个特效,毕业设计要做一些记录,就把这些都记下来吧,万一用到的时候忘了呢 function changeTab() { let navs = document.getElementsByTa ...
- Python总纲路线
比较全面的Python学习方案: 一,Python 基础教程 二,Python 高级教程 这是系统写学习资料参考,后面会整理单个的学习应用内容. 廖雪峰Python教程传送门
- ubuntu下TFTP Server 的安装和使用方法
tftp是一种于1981年在RFC 783中定义的简化的文件传输协议(FTP).小型文件传输协议非常简单,通过少量存储器就能轻松实现 ——这在当时是很重要的考虑因素.所以TFTP被用于引导计算机,例如 ...
- 实例分析JAVA CLASS的文件结构
今天把之前在Evernote中的笔记重新整理了一下,发上来供对java class 文件结构的有兴趣的同学参考一下. 学习Java的朋友应该都知道Java从刚开始的时候就打着平台无关性的旗号,说“一次 ...
- Django--Auth 模块
1 Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码 ...
- 模板引擎之-jade
##### 首先我们安装jade模板引擎并编译`npm install jade --global`在项目文件夹下创建一个`index.jade`文件,并且写入```doctypehtml head ...
- docker 安全
由于容器运行在主机上,且与主机共用一套内核,因此在容器的安全使用上会涉及到容器本身以及主机的安全加固,如针对系统调用,系统资源,远程访问等都需要进行安全方面的考量. docker官网给出了简单的一些建 ...
- Python NumPy学习总结
一.NumPy简介 其官网是:http://www.numpy.org/ NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.Num ...