Java基於過濾器進行重定向不成功問題的兩種解決辦法,以及基於JSF的ajax重定向解決辦法


我創建了一個過濾器,只要用戶沒有登陸就不能連接到主界面,但是在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) throws IOException {
        //獲取當前請求的路徑
        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"); } } });

最后運行成功。

 

以上主要參考的博客有:

https://blog.csdn.net/u013997090/article/details/77338508

https://blog.csdn.net/webCows/article/details/78711326

 

方法二

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

 

2020/02/25更新

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

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

private static final String AJAX_REDIRECT_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<partial-response><redirect url=\"%s\"></redirect></partial-response>";

在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");
            }

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM