Spring boot + shiro 跨域失效

在 Springboot 中解決跨域有好幾種方式,比如:

  1. 使用 @CrossOrigin 註解
  2. 實現 WebMvcConfigurer,然後重寫它的 addCorsMappings 方法。

這兩種方式在 springboot 中都能解決跨域的問題,但是在整合shiro後,跨域就失效了。

原因是:shiro的過濾器會在跨域處理之前執行,這就導致未允許跨域的請求先到達shiro過濾器,這樣就會出現跨域錯誤。

解決方案
使用Filter的方式解決跨域

@Component
public class CorsFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("FilterConfig init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, If-Modified-Since, x-token");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.addHeader("Access-Control-Allow-Credentials", "true");

        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }
}

這樣跨域的 CorsFilter 過濾器就會在Shiro過濾器之前執行了。


技 術 無 他, 唯 有 熟 爾。
知 其 然, 也 知 其 所 以 然。
踏 實 一 些, 不 要 着 急, 你 想 要 的 歲 月 都 會 給 你。


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