java过滤器重定向_Java基于过滤器进行重定向不成功问题的兩種解決辦法,以及基於JSF的ajax重定向解決辦法...

当Java过滤器尝试在未登录用户访问主界面时重定向到登录页面,由于AJAX请求的特性导致重定向失败。解决方案包括在过滤器中判断请求类型并相应设置响应头,然后在前端JS中捕获并处理重定向;或者在过滤器中直接返回XML,使JSF框架的AJAX请求能识别并执行重定向。
摘要由CSDN通过智能技术生成

我创建了一个过滤器,只要用户没有登陆就不能连接到主界面,但是在doFilter方法中用重定向在前端跳转页面不成功。

原因:由于我的登陆界面是基于ajax请求的,而ajax默认不支持重定向,他只能局部更新,所以我创建的过滤器跳转页面不成功

解决:

方法一

一些请求路径:

1. request.getScheme() 返回当前链接使用的协议;

2. request.getServerName() 获取网站的域名;

3. request.getServerPort() 获取的服务器的请求端口;

4. request.getContextPath()获取当前的系统路径;

第一步、以我创建的LoginFilter为例,将LoginFilter的重定向response.sendRedirect("login.jsp");注释掉,改为一个方法进行判断ajax的跳转,方法如下

private void requestDirect(HttpServletRequest request, HttpServletResponse response) throwsIOException {//获取当前请求的路径

String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath();//如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求

if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){//前端需要判断是否是重定向

response.setHeader("SESSIONSTATUS", "TIMEOUT");

response.setHeader("CONTEXTPATH",basePath+"/login.jsp");

response.setStatus(HttpServletResponse.SC_FORBIDDEN);

}else{

response.sendRedirect(basePath+ "/login.jsp");

}

}

第二步、在公共js中添加一段代码

//设置ajax请求完成后运行的函数,

$.ajaxSetup( {//设置ajax请求结束后的执行动作

complete :function(XMLHttpRequest, textStatus) {//通过XMLHttpRequest取得响应头,sessionstatus

var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");if (sessionstatus == "TIMEOUT") {var win =window;while (win !=win.top){

win=win.top;

}

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

}

}

});

最后运行成功。

以上主要参考的博客有:

方法二

還有一種思路是判斷是後台判斷ajax請求,可以將它返回到前台,在前台判斷進行重定向window.location.href=xxx。

2020/02/25更新

JSF架構在開發過程中發現還有一種方法可以解決ajax請求不能重定向的問題

在過濾器聲明以下全局變量

private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"

+ "";

在doFilter方法中實現以下代碼

boolean isAjaxRequest = "partial/ajax".equals(hRequest.getHeader("Faces-Request"));if(isAjaxRequest){//ajax請求的重定向

hResponse.setContentType("text/xml");

hResponse.setCharacterEncoding("UTF-8");

hResponse.getWriter().printf(AJAX_REDIRECT_XML, hRequest.getContextPath()+ "/login.jsf");

}else{//其他請求的重定向

hResponse.sendRedirect(hRequest.getContextPath() + "/login.jsf");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值