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. Solutions and Summay for Linked List Naive and Easy Questions

    1.Remove Linked List Elements package linkedlist; /* * Question: Remove all elements from a linked l ...

  2. undo空间满的处理方法(含undo的学习与相关解释)

    1.查看数据库当前实例使用的是哪个UNDO表空间: show parameter undo_tablespace 2.查看UNDO表空间对应的数据文件和大小 pages col file_name f ...

  3. Java学习笔记34(集合框架八:综合案例:模拟斗地主的洗牌发牌)

    规则: 1.54张扑克牌,有花色 2.顺序打乱,一人一张依次发牌,一人17张,留三张作为底牌 3.看牌:按大小王2A....43的序排列打印 示例: package demo; import java ...

  4. 前后端分离开发之前端自己的API(DB)---- (1)

    Creating demo APIs for Front-End Developer 心理准备 Tool-1 开发工具/编辑器:Visual Studio Code , 即 VSCode官网: htt ...

  5. Spring中新建记录后返回自增主键的处理方法

    接手一个旧系统改造的过程,要插入后立即返回自增值,不能重构guid类型主键,Spring提供了很优美的机制. Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值 ...

  6. 25-socket

    socket通信流程 #server端 #family参数代表地址家族,可为AF_INET或AF_UNIX.AF_INET家族包括#Internet地址,AF_UNIX家族用于同一台机器上的进程间通信 ...

  7. scrapy爬虫--苏宁图书

    实现业务逻辑如下: 1. 创建scrapy项目,并生成 爬虫2. 在suning.py中实现Schedul 和 Spider业务逻辑3. 修改start_urls为正确的初始请求地址4. 构造pars ...

  8. mint-ui Infinite scroll 重复加载、加载无效的原因及解决方案

    1.无限滚动的运用场景: 一般运用在列表展示,有分页.下拉加载更多的需求中. 2.代码分析 代码很简单,实现了列表分页,数据加载完之后显示数据状态 <template> <div c ...

  9. shell编程中的if语句

    if语句在任何编程中都是必不可少.至关重要的分支语句,shell也是如此,只不过各种编程中的方式和格式有点不太一样 shell编程中的if语句基本格式如下: if [ X$1 = XA ];then ...

  10. LDA-线性判别分析(二)Two-classes 情形的数学推导

    本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...