过滤器实现登录拦截需要注意的问题(AJAX请求的处理)
2017-06-03 00:00
1576 查看
摘要: 在实现登录拦截是由于前台与后台是用ajax做的页面数据交互,另外我们也都知道ajax请求是不能转发或者重定向的
最终的最终在同事zt的提示下,恍然大悟,虽然很基本的问题,但也纠结了好久,只能说太菜,记录下来,以免以后再犯。
代码如下:
1.问题描述:
最近自己在写demo时遇到一个问题,在ajax请求时用Filter做登录拦截,结果页面不跳转(Ajax是不能做转发和重定向的)、、、、最终的最终在同事zt的提示下,恍然大悟,虽然很基本的问题,但也纠结了好久,只能说太菜,记录下来,以免以后再犯。
2.解决办法:
在doFilter方法中判断是否为Ajax请求,做进一步处理代码如下:
/** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletResponse resp=(HttpServletResponse) response; HttpServletRequest req=(HttpServletRequest) request; String url = req.getRequestURI(); System.out.println(url); HttpSession session = ((HttpServletRequest) request).getSession(); String path = req.getContextPath(); String basePath= req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+path+"/"; basePath=basePath+"rest/userManager/loginOut"; try { // 过滤掉登陆和退出请求 if ((url.indexOf("/ddoa/rest/userManager/login") >= 0)|| (url.indexOf("/ddoa/rest/userManager/loginOut") >= 0)) { chain.doFilter(request, response); } else { if (null != session) { Map<Object, Object> map = (Map<Object, Object>) session.getAttribute("userMap"); if(null!=map){ chain.doFilter(request, response); }else{ //1:判断是否是ajax请求 if (req.getHeader("x-requested-with") != null&& "XMLHttpRequest".equalsIgnoreCase(req.getHeader("x-requested-with"))) { //向http头添加 状态 sessionstatus resp.setHeader("sessionstatus","timeout"); resp.setStatus(403); //向http头添加登录的url resp.addHeader("loginPath", basePath); chain.doFilter(request, response); return ; }else{ resp.sendRedirect(basePath); } } } else { //1:判断是否是ajax请求 if (req.getHeader("x-requested-with") != null&& "XMLHttpRequest".equalsIgnoreCase(req.getHeader("x-requested-with"))) { //向http头添加 状态 sessionstatus resp.setHeader("sessionstatus","timeout"); resp.setStatus(403); //向http头添加登录的url resp.addHeader("loginPath", basePath); chain.doFilter(request, response); return ; }else{ resp.sendRedirect(basePath); } } } } catch (IOException | ServletException e) { e.printStackTrace(); } }
相关文章推荐
- Struts 通过拦截器实现登录后跳转到登录前页面 处理普通Http请求和Ajax请求时拦截配置
- IE中ajax+jsp登录界面,由于缓存导致jsp过滤器与ajax请求被拦截的问题和解决
- IE中ajax+jsp登录界面,由于缓存导致jsp过滤器与ajax请求被拦截的问题和解决
- 关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
- session失效,使用ajax请求数据被拦截,此时正常的处理逻辑是跳到登录界面,而不是界面没有变化(java判断是否是ajax请求)
- jquery 跨域 异步请求 自定义头部 预检请求 spring mvc拦截处理 实现token单点登录
- SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)
- Shiro 处理ajax请求 拦截登录超时 解决!
- Spring Security管理下的ajax请求登录超时问题处理
- Spring MVC中处理ajax请求的跨域问题与注意事项详解
- ajax前置处理实现异步请求session过期时跳转登录页面
- java Servlet Filter 拦截Ajax请求,统一处理session超时的问题
- 关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
- shiro 拦截器实现session过期拦截ajax请求的处理
- 记录问题:登录session过期,ajax请求被web security拦截,页面没有数据且没有重定向到login页面
- Shiro 处理ajax请求 拦截登录超时---解决!
- session失效,使用ajax请求数据被拦截,此时正常的处理逻辑是跳到登录界面,而不是界面没有变化(java推断是否是ajax请求)
- 用反向代理nginx proxy_pass配置解决ie8 ajax请求被拦截问题 ie8用nginx代理实现跨域请求访问 nginx405正向代理request_uri
- 不需要用vuex,只需要用到axios一样可以实现登录拦截,想后台请求数据
- MVC模式实现用户登录练习中遇到的问题和需要注意的细节