springboot2+redis解決接口安全性問題,shiro跨域CORS請求,後臺拿不到headers中的token值?

前端錯誤信息

後端攔截器一直接收不到token和userId信息

在這裏插入圖片描述

但這個時候嘗試用postman(postman不會出現跨域問題)發送試試,結果可以收到值,WTF???,開始考慮的原因可能是token和userId沒有放入headers中,後來通過仔細看了下沒問題啊

爲什麼不發送值呢。仔細又去看了CROS的介紹。原來CROS複雜請求時會先發送一個OPTIONS請求,來測試服務器是否支持本次請求,這個請求時不帶數據的,請求成功後纔會發送真實的請求。所以前面那個只發送key的問題是要確認服務器支不支持接收這個headers。所以每次獲取不到數據的請求都是OPTIONS請求?。所以我們要做的就是把所有的OPTIONS請求統統放行。

做法是在 StatelessAuthcFilter(自定義的過濾器) 中繼承AccessControlFilter(Shiro自帶的過濾器) 並重寫其中的 preHandler 方法。 代碼如下:

    @Override
    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
        HttpServletRequest httpRequest = WebUtils.toHttp(request);
        HttpServletResponse httpResponse = WebUtils.toHttp(response);
        if (httpRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
            httpResponse.setHeader("Access-control-Allow-Origin", httpRequest.getHeader("Origin"));
            httpResponse.setHeader("Access-Control-Allow-Methods", httpRequest.getMethod());
            httpResponse.setHeader("Access-Control-Allow-Headers", httpRequest.getHeader("Access-Control-Request-Headers"));
            httpResponse.setStatus(HttpStatus.OK.value());
            return false;
        }
        return super.preHandle(request, response);
     } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章