最近写的一个servlet过滤器,用于拦截请求,判断用户是否登录。

写好后发现一个问题,当我直接在浏览器地址栏里输入地址,可以跳转页面;当点击按钮时,过滤器代码正常执行,但是页面没有跳转;是因为按钮都是ajax请求,默认ajax是不支持重定向的,因为ajax本身就是局部刷新,不会重新加载页面的。所以需要在过滤器里再加个ajax请求判断,然后找个前台公共js加一个方法。上代码

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws ServletException, IOException {

HttpServletRequest request = (HttpServletRequest)servletRequest;

HttpServletResponse response = (HttpServletResponse)servletResponse;

String currentURL = request.getRequestURI();

String ctxPath = request.getContextPath();

//除掉项目名称时访问页面当前路径

String targetURL = currentURL.substring(ctxPath.length());

HttpSession session = request.getSession(false);

String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ ctxPath;

String type = request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");// XMLHttpRequest

if (currentURL.endsWith(".js") || currentURL.endsWith(".css") || currentURL.endsWith(".png") || currentURL.endsWith(".jpg")) {

//这里表示如果是静态文件,则进行正常的页面跳转

filterChain.doFilter(request, response);

return;

} else {

String url = targetURL.substring(targetURL.lastIndexOf('/'));

//对当前页面进行判断,如果当前页面不为登录页面

if(!(signin_page.equals(targetURL) || signin.equals(url))){

System.out.println("1---"+targetURL+"---ctxPath:"+ctxPath+"---currentURL:"+currentURL);

//在不为登陆页面时,再进行判断,如果不是登陆页面也没有session则跳转到登录页面

if(session == null || session.getAttribute("user") == null){

if (StringUtils.equals("XMLHttpRequest", type)) {

// 处理ajax请求

response.setHeader("REDIRECT", "REDIRECT");//告诉ajax这是重定向

response.setHeader("CONTEXTPATH", basePath+"/signin.html");//重定向地址

response.setStatus(HttpServletResponse.SC_FORBIDDEN);

return;

}else{

response.sendRedirect(ctxPath+signin_page);

return;

}

}else{

//这里表示正确,会去寻找下一个链,如果不存在,则进行正常的页面跳转

filterChain.doFilter(request, response);

return;

}

}else{

//这里表示如果当前页面是登陆页面,跳转到登陆页面

filterChain.doFilter(request, response);

return;

}

}

}

上面是java过滤器代码,添加了对于ajax请求的判断。

$.ajaxSetup( {

//设置ajax请求结束后的执行动作

complete : function(XMLHttpRequest, textStatus) {

// 通过XMLHttpRequest取得响应头,REDIRECT

var redirect = XMLHttpRequest.getResponseHeader("REDIRECT");//若HEADER中含有REDIRECT说明后端想重定向

if (redirect == "REDIRECT") {

var win = window;

while (win != win.top){

win = win.top;

}

//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求

win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");

}

}

});

java过滤器重定向_解决ajax请求过滤器重定向不跳转 (过滤器)相关推荐

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

    解决spring-security session超时 Ajax 请求没有重定向的问题 参考文章: (1)解决spring-security session超时 Ajax 请求没有重定向的问题 (2) ...

  2. 解决Ajax请求时无法重定向的问题

    解决Ajax请求时无法重定向的问题 参考文章: (1)解决Ajax请求时无法重定向的问题 (2)https://www.cnblogs.com/lgjlife/p/10445483.html 备忘一下 ...

  3. 解决ajax请求跨域,解决ajax请求跨域

    跨域大部分需要通过后台解决,引起跨域的原因: 3个问题同时满足 才可能产生跨域问题,即跨域(协议,主机名,端口号中有一个不同就产生跨域) 下面是解决方法 方法一 // ajax请求跨域 /* *解决a ...

  4. php ajax session失效,PHP中解决ajax请求session过期退出登录问题

    1.session过期,如果直接是url请求,或者用户在打开的系统页面中直接清除缓存及cookie信息,可直接在php的入口文件中调用以下封装的方法,进行session信息判断以及页面的跳转,如: i ...

  5. ajax请求提示html状态码302,快速解决ajax请求出错状态码为0的问题

    今天在使用 ajax 向后台请求数据时出现错误,提示状态码为 0 ,后台采用的是 spring mvc 架构. 状态码为0是什么意思呢?查找了下,原来它意味着 (未初始化)即没有调用到send()方法 ...

  6. php 响应时间,PHP下解决ajax请求服务器响应时间过长问题

    PHP下解决ajax请求服务器响应时间过长的办法:首先在浏览器输入测试网址,找到Networky以及ajax发送的请求:然后找到TTFB的响应时间对应的php文件,并删掉这些代码:最后将数据库loca ...

  7. ajax去掉session,PHP中解决ajax请求session过时退出登陆问题

    一.session过时,若是直接是url请求,或者用户在打开的系统页面中直接清除缓存及cookie信息,可直接在php的入口文件中调用如下封装的方法,进行session信息判断以及页面的跳转,如: p ...

  8. Ajax请求成功后页面跳转

    文章目录 Ajax实现页面局部刷新 Ajax请求成功后页面跳转 Ajax实现页面局部刷新 这里通过点击一个按钮,然后下面产生一段文字,而整个页面不用刷新 <!DOCTYPE html> & ...

  9. 前后端分离 ajax请求后台重定向

    最近在做的一个前后端分离的一个项目,这就涉及到登录验证的问题.我用的是token加上filter. 1,前端请求登录的时候,用用户名和加上当前时间生成一个token,存入redis,然后返回给前端. ...

最新文章

  1. Java基础语法(一)注释,关键字,常量,变量,数据类型,标识符,数据类型转换...
  2. arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法
  3. BloomFilter–大规模数据处理利器(转)
  4. C#遍历指定文件夹中的所有文件和子文件夹
  5. Random随机数相关工具类
  6. Z字变换Python解法
  7. 用three.js写一个简单的3D射门游戏
  8. 怎么委婉地不让婆婆每天来我家?
  9. linux下内存的统计和内存泄露问题的定位-转
  10. WCF与AJAX编程开发实践(2):支持ASP.NET AJAX的Web Service
  11. axios的this指向_vue使用axios时this指向哪里
  12. StringUtil.isNotEmpty
  13. FbinstTool万能启动超级简单教程
  14. 企业管理--盖洛普Q12测评法
  15. 【果壳笔记】生物信息学——王秀杰老师部分
  16. 20170603学习笔记整理
  17. 【韩顺平utility工具类】
  18. Adaptive AUTOSAR----Adaptive studio
  19. Python智力问答小游戏
  20. python中turtle画笑脸_怎么用python实现画笑脸

热门文章

  1. 阿里云域名注册流程(图文教程很详细)
  2. html 重复显示,使用相同的JavaScript重复HTML
  3. 入户广州户口需要什么条件?
  4. 上线!Chatopera首发开源心理咨询对话语料库
  5. 建筑八大员考试武汉材料员考试建筑工程材料管理的强化措施
  6. 进宠物商店买小动物的小游戏程序
  7. mysql恩阳执行脚本_王新栋 | 2017京东商城-京麦平台618备战实践
  8. Spring MVC 控制层model.addAllAttribute()和model.addAllAttributes()方法的区别
  9. 中国第一程序员 求伯君
  10. i7+GTX1660Ti电脑安装PaddlePaddle-GPU