最近項目後臺當中會被微信小程序端和 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 來源