關於自定義過濾器獲取不到session問題

自定義過濾器獲取不到session

根本原因,多個自定義過濾器執行順序問題

問題

action請求中request對象為ShiroHttpServletRequest, 可以取到session內容    

而在第一個自定義過濾器中request對象為requestfacade,取不到session內容

原因

session由shiro管理,凡是在shiro過濾器順序之前的自定義過濾器都取不到session內容

解決辦法

將shiro過濾器放在第一個位置

    

登錄攔截器取到的session為空

寫瞭一個攔截器

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    /**
     * 註冊攔截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**.html").excludePathPatterns("/Ylogin.html","/Yindex.html","/YRegister.html");
    }
}

判斷有沒有登錄

然後那時候我這邊session.getAttribute(“user”)一直為空

public class MyInterceptor implements HandlerInterceptor {
    //在請求處理之前進行調用(Controller方法調用之前
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("開始請求地址攔截");
        //獲取session
        HttpSession session = httpServletRequest.getSession();
        if (session.getAttribute("user") != null)
            return true;
        httpServletResponse.sendRedirect("/Ylogin.html");
            return false;
    }
    //請求處理之後進行調用,但是在視圖被渲染之前(Controller方法調用之後)
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle被調用");
    }
    //在整個請求結束之後被調用,也就是在DispatcherServlet 渲染瞭對應的視圖之後執行(主要是用於進行資源清理工作)
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion被調用");
    }
}

在另外頁面能得到session的值

但是在攔截器那裡就session為null,煩瞭很久,以為是自己寫錯瞭攔截器,搞瞭很久最後才知道,是login.js寫錯瞭。就是ajax的url寫錯瞭

$.ajax({
            type: "POST",
            url: "/user/doLogin",
            dataType: "json",
            data:user,
            async:false,
            success: function(res) {}
            })

因為我以前地址寫的是url:“http://127.0.0.1:8080/user/doLogin”,把前面的ip地址省略就行瞭,ip地址和localhost的區別

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: