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: 会话存储
window  ['wɪndəʊ]  window&type=1详细X
基本翻译
n. 窗;窗口;窗户
网络释义

sessionStorage记录返回前端的数据,用于解决登录拦截器刷新页面的问题的更多相关文章

  1. 解决SpringMVC拦截器中Request数据只能读取一次的问题

    解决SpringMVC拦截器中Request数据只能读取一次的问题 开发项目中,经常会直接在request中取数据,如Json数据,也经常用到@RequestBody注解,也可以直接通过request ...

  2. spring controller获取web前端post数据乱码解决

    web.xml文件加上如下代码<!-- post请求乱码拦截器 --><filter> <filter-name>CharacterEncodingFilter&l ...

  3. 解决Ajax.BeginForm还是刷新页面的问题

    在.net mvc中用Ajax.BeginForm来实现异步提交,在Ajax.BeginForm里面还是可以用submit按钮,一般来说 submit按钮是提交整个页面的数据.但是在Ajax.Begi ...

  4. 解决Struts2拦截器的对于参数传递无效问题

    今天做项目时,使用拦截器对用户权限检查.拦截器本身没有问题,可是实现权限拦截,但是传递的参数全部都无效了.搞了很久,由于对拦截器的内部机制不是特别熟悉,所以重新研读了一下Struts2的拦截器.找到了 ...

  5. 解决mybatis拦截器无法注入spring bean的问题

    公司要整合rabbitmq与mybatis拦截器做一个数据同步功能. 整合过程中大部分环节都没什么问题,就是遇到了mybatis拦截器 @Intercepts(@Signature(type = Ex ...

  6. Jquery DataTable AJAX跨域请求的解决方法及SSM框架下服务器端返回JSON格式数据的解决方法

    如题,用HBuilder开发APP,涉及到用AJAX跨域请求后台数据,刚接触,费了不少时间.幸得高手指点,得以解决. APP需要用TABLE来显示数据,因此采用了JQ 的DataTable.  在实现 ...

  7. orm 查询数据库随机返回一条数据的解决办法用models.User.objests.all().order_by('?').first()

  8. 解决SpringMVC拦截器拦截静态资源的问题。

    在使用SpringMVC进行开发的时候,遇到了以下代码不能执行的情况.而且我已经正确导入了JQuery框架. <script type="text/javascript"&g ...

  9. Vue-Cli3.0 单页面如何预渲染,解决登录拦截导致无法部分路由无法预渲染问题?

    vue单页面不利于seo,如何解决已有spa项目seo问题? 1.安装 cnpm install prerender-spa-plugin --save-dev 2.路由history模式 const ...

随机推荐

  1. 团队作业第五周(HCL盐酸队)

    一.Alpha版本测试报告 1.测试计划 测试项目 上下移动   左右移动   发射子弹   与敌方坦克进行攻击 2.测试过程 测试截图 错误记录(提交issues到码云团队项目) 3.测试找出的bu ...

  2. [算法专题] 二分搜索&排序数组

    基础知识 二分非递归写法: int binary_search(const int a[], const int size, const int val) { int lower = 0; int u ...

  3. CentOS 配置SOCKS5代理服务

    SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全 通过yum安装 ...

  4. windows phone开发-windows azure mobile service使用入门

    在使用azure之前,我一直只能做本地app,或者使用第三方提供的api,尽管大多数情况下够用,但是仍不能随心所欲操纵数据,这种感觉不是特别好.于是在azure发布后,我就尝试使用azure来做为个人 ...

  5. LeetCode--No.013 Roman to Integer

    13. Roman to Integer Total Accepted: 95998 Total Submissions: 234087 Difficulty: Easy Given a roman ...

  6. 机器学习与Tensorflow(4)——卷积神经网络与tensorflow实现

    1.标准卷积神经网络 标准的卷积神经网络由输入层.卷积层(convolutional layer).下采样层(downsampling layer).全连接层(fully—connected laye ...

  7. 项目- Vue全家桶实战去哪网App

    最近在学习Vue,花了几天时间跟着做了这个项目,算是对学习Vue入门的一个总结,欢迎同学们star 去哪网APP

  8. js设计模式小结

    1 构造函数模式 var Person = function(name){ this.name = name; this.getName = function(){ console.log(this. ...

  9. 【sping揭秘】14、@before @AfterThrowing

    @before 基础模式,我们先直接看一下就可以了,比较简单,网上一堆... 不是我装逼哈,我学了那么久spring,aop的皮毛也就是网上的那些blog内容,稍微高级点的我也不会,这里跳过基础部分 ...

  10. undefined 和 undeclared 的区别

    var a; //undefined b; // b is not defined 区别:在变量作用域中已经申明但没有赋值的变量(如 a),是undefined.相反,在变量作用域中没有申明过的变量, ...