最近项目后台当中会被微信小程序端和 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 来源
关注公众号查看更多资源