springboot 使用過濾器解決跨域問題和無法獲取到 header 中值的問題

最近項目後臺當中會被微信小程序端和 web 端同時請求,web 端是前後分離的,所以可能存在跨域問題,而微信小程序端則不存在跨域問題。所以就要求兩端請求後臺時,header 同時放入一個來源 source,後端過濾器中再去區分進行相關配置。

一、過濾器解決跨域問題代碼


package com.wxw.upload.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author wuxiongwei
 * @date 2020/6/5 14:59
 * @Description
 */
 @Component
public class Filter implements javax.servlet.Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

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

        String source = request.getHeader("source");// 從 http 請求頭中取出來源

       
        //小程序端
        if("1".equals(source)){
            //todo
        }
        //web 端
        if("2".equals(source)){
            response.setHeader("Access-Control-Allow-Origin","*");
            response.setHeader("Access-Control-Allow-Credentials", "true");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        }
        
		filterChain.doFilter(request, servletResponse);
    }

    @Override
    public void destroy() {

    }
}


加了過濾器這段代碼之後,我們的跨域問題還是無法解決,請繼續往下看

二、解決 web 端處理跨域請求時,無法獲取到 header 中值的問題

原因是這樣的,對於【複雜的】跨域ajax請求,請求方思路是這樣的:先發送一個 OPTIONS 請求,確認是可以請求的,之後才發送我們真正的 get 或者 post 等我們在 ajax 中定義的請求;第一次 OPTIONS 請求,headers 是不會帶過來的,所以過濾器中是要跳過這種請求的。處理方式如下

		  //放行 options 的請求
        if ("OPTIONS".equals(request.getMethod())) {
            filterChain.doFilter(request, servletResponse);
        }

當我們如果沒有加上面這段代碼的時候,下面這行代碼獲取出來的值就是 null , 我們也就無法爲 web 端設置跨域了

String source = request.getHeader("source");// 從 http 請求頭中取出 token 來源
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章