本问题解决方案参照网站多篇文章融合解决,在此表示感谢!

环境:springboot+shiro+jquery-easyui

问题:在ajax请求时,如果此时session已经失效,系统没有自动跳转到登录页面。后来在服务端加了判断ajax请求的代码,结果还是没有用,无法取到ajax特定的head值(X-Requested-With)。发现jquery-easyui表单提交时没有就没有传递这个值。

解决办法:

1.添加拦截器

  1. import javax.servlet.ServletRequest;
  2. import javax.servlet.ServletResponse;
  3. import javax.servlet.http.HttpServletRequest;
  4.  
  5. import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;
  8.  
  9. public class SessionFilter extends FormAuthenticationFilter {
  10.  
  11. private Logger logger = LoggerFactory.getLogger(SessionFilter.class);
  12. private final static String X_REQUESTED_WITH_STRING = "X-Requested-With";
  13. private final static String XML_HTTP_REQUEST_STRING = "XMLHttpRequest";
  14. private final static String SESSION_OUT_STIRNG = "sessionOut";
  15.  
  16. @Override
  17. protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
  18. if (this.isLoginRequest(servletRequest, servletResponse)) {
  19. if (this.isLoginSubmission(servletRequest, servletResponse)) {
  20. return this.executeLogin(servletRequest, servletResponse);
  21. } else {
  22. return true;
  23. }
  24. } else {
  25. if (isAjax((HttpServletRequest) servletRequest)) {
  26. servletResponse.getWriter().print(SESSION_OUT_STIRNG);
  27. } else {
  28. this.saveRequestAndRedirectToLogin(servletRequest, servletResponse);
  29. }
  30. return false;
  31. }
  32. }
  33.  
  34. public boolean isAjax(HttpServletRequest httpServletRequest) {
  35. String header = httpServletRequest.getHeader(X_REQUESTED_WITH_STRING);
  36. if (XML_HTTP_REQUEST_STRING.equalsIgnoreCase(header)) {
  37. logger.debug("当前请求为Ajax请求:{}", httpServletRequest.getRequestURI());
  38. return Boolean.TRUE;
  39. }
  40. logger.debug("当前请求非Ajax请求:{}", httpServletRequest.getRequestURI());
  41. return Boolean.FALSE;
  42. }
  43.  
  44. }

2.覆盖默认shiro拦截器

  1. @Bean
  2. public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
  3. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  4. // 必须设置 SecurityManager
  5. shiroFilterFactoryBean.setSecurityManager(securityManager);
  6. // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
  7. shiroFilterFactoryBean.setLoginUrl("/login");
  8. // 登录成功后要跳转的链接
  9. shiroFilterFactoryBean.setSuccessUrl("/index");
  10. // 未授权界面;
  11. shiroFilterFactoryBean.setUnauthorizedUrl("/403");
  12. // 自定义拦截器
  13. Map<String, Filter> filtersMap = new LinkedHashMap<String, Filter>();
  14. // 限制同一帐号同时在线的个数。
  15. filtersMap.put("kickout", filterKickoutSessionControl());
  16. shiroFilterFactoryBean.setFilters(filtersMap);
  17. // 权限控制map.
  18. Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
  19. filterChainDefinitionMap.put("/servlet/authimage", "anon");
  20. filterChainDefinitionMap.put("/**", "authc");
  21. shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  22. Map<String, Filter> filters=new LinkedHashMap<>();
  23. filters.put("authc", new SessionFilter());
  24. shiroFilterFactoryBean.setFilters(filters);
  25. return shiroFilterFactoryBean;
  26. }

这个是重点,覆盖shiro默认的拦截器:

  1. Map<String, Filter> filters=new LinkedHashMap<>();
  2. filters.put("authc", new SessionFilter());
  3. shiroFilterFactoryBean.setFilters(filters);

3.改造前端

一开始采用了修改form提交的参数,把iframe=false就可以提交X-Requested-With,但是这样的异步请求实在太多,不仅仅在form提交,还有combo,tree等等。所以最后用了网上说的方法,改造$.ajax达到统一处理。

  1. //首先备份下jquery的ajax方法
  2. var _ajax = $.ajax;
  3. // 重写jquery的ajax方法
  4. $.ajax = function(opt) {
  5. // 备份opt中error和success方法
  6. var fn = {
  7. error : function(XMLHttpRequest, textStatus, errorThrown) {
  8. },
  9. success : function(data, textStatus) {
  10. }
  11. }
  12. if (opt.error) {
  13. fn.error = opt.error;
  14. }
  15. if (opt.success) {
  16. fn.success = opt.success;
  17. }
  18.  
  19. // 扩展增强处理
  20. var _opt = $.extend(opt, {
  21. error : function(XMLHttpRequest, textStatus, errorThrown) {
  22. debugger;
  23. erro = eval("(" + XMLHttpRequest.responseText + ")");
  24. // 错误方法增强处理
  25. fn.error(XMLHttpRequest, textStatus, errorThrown);
  26. },
  27. success : function(data, textStatus) {
  28. if (data != 'sessionOut') {
  29. fn.success(data, textStatus)
  30. return false;
  31. } else {
  32. top.location.href = appPath + "/";
  33. }
  34. }
  35. });
  36. return _ajax(_opt);
  37. };

这个地方要根据个人情况修改一下:

Shiro:ajax的session超时处理的更多相关文章

  1. ajax提交session超时跳转页面使用全局的方法来处理

    来自:http://www.jb51.net/article/43770.htm 如果是ajax提交,超时时从服务器发出的跳转命令就不会起作用,所以如果是session超时,而且是在ajax请求,就在 ...

  2. Ajax请求Session超时的解决办法:拦截器 + 封装jquery的post方法

    目标:前端系统,后端系统等,统一处理Session超时和系统错误的问题. 可能需要处理的问题:Session超时.系统500错误.普通的业务错误.权限不足. 同步请求:            Sess ...

  3. Ajax请求Session超时解决

    web前端js代码: $.ajaxSetup({ contentType : "application/x-www-form-urlencoded;charset=utf-8", ...

  4. Shiro中session超时页面跳转的处理

    问题描述 shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时. 本文从这两个方面分别考虑并处理. ajax请 ...

  5. java Servlet Filter 拦截Ajax请求,统一处理session超时的问题

    后台增加filter,注意不要把druid也屏蔽了 import java.io.IOException; import javax.servlet.Filter; import javax.serv ...

  6. spring security:ajax请求的session超时处理

    当前端在用ajax请求时,如果没有设置session超时时间并且做跳转到登录界面的处理,那么只是靠后台是很难完成超时的一系列动作的:但是如果后台 没有封装一个ajax请求公共类,那么在ajax请求上下 ...

  7. 解决spring-security session超时 Ajax 请求没有重定向的问题

    开始时, 代码是这样的: $.ajax({ type : "POST", url : sSource, cache : false, dataType : "json&q ...

  8. dwz ajax session超时跳转登录页(struts2自定义拦截器)

    1.定义struts2拦截器(网上例子很多) 代码如下: package rt.intercepter; import java.util.Map; import javax.servlet.http ...

  9. Ajax 提交session实效跳转到完整的登陆页面

    在spring security 中 Ajax提交时,session超时,局部加载登陆页面,为解决这个问题,重写ajax提交,返回的是modeview或者没有制定datatype时; 如果检测到加载到 ...

随机推荐

  1. HTML5之HTTP协议

    ---恢复内容开始--- 99%的人都理解错了HTTP中GET与POST的区别 2016.10.11 13:23:22来源: 51cto作者:51cto   (转)   GET和POST是HTTP请求 ...

  2. 软件工程作业 - Week 1

    构建之法读后疑问: 初步的完成构建程序设计思路之后实现过程中发现了问题或者可以优化的地方是立马就改进还是完成之后按照步骤统一进行优化. 覆盖性测试,针对一些永远用不到只是用来预防极为极端的情况下,例如 ...

  3. Linux kernel 发布 5.0-rc1 版本

    Linux kernel 要发布 5.0 了.. 跟原因是 linus 认为 4.21的小版本号太多了... 邮件内容如下: https://lore.kernel.org/lkml/20190107 ...

  4. Delphi cxGrid加行号

    procedure SetRowNumber(var ASender: TcxGridTableView; AViewInfo: TcxCustomGridIndicatorItemViewInfo; ...

  5. Cucumber java + Webdriver(一)

    一.打开Eclipse,新建一个maven项目,打开pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xm ...

  6. log4j 相对路径

    参考: http://elf8848.iteye.com/blog/2008595 log4j.logger.ApiLog=debug,ApiLog log4j.appender.ApiLog=org ...

  7. Firefox download 乱码问题。

    import javax.mail.internet.MimeUtility; fileName = MimeUtility.encodeWord ( fileName ); response.add ...

  8. BZOJ 百题纪念!

    一百题辣! 现在NOI知识点中最基础的那部分已经学完了--这几天发现自己会写SA啊树剖啊可持久化Trie啊之类模板题--还挺开心的-- 逛了两天学长博客之后--BZOJ100题辣--也挺开心的-- 现 ...

  9. ssh框架配置过程

    1.pom.xml配置依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  10. java基础基础总结----- RunTime