zoukankan      html  css  js  c++  java
  • CORS跨域问题

    1、参考文档:

    https://www.jianshu.com/p/1ad4358beff7?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    2、代码实例

    package com.wangymd.cors;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class MyCorsFilter implements Filter {
    
        private final static Logger LOGGER = LoggerFactory.getLogger(TalentTagCorsFilter.class);
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    //设置跨域请求
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    
            String origin = httpServletRequest.getHeader("Origin");
            //来源头是啥就设置啥,相当于不设置过滤
            httpServletResponse.setHeader("Access-Control-Allow-Origin", origin);
            LOGGER.error("CrossDomainFilter origin:{}", origin);
            //表示的是跨域的ajax中可以携带cookie,此时第一项设置不能为*,需指定域名
            httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
            httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
            httpServletResponse.setHeader("Access-Control-Allow-Headers", "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since");
            //表示在3600秒内,不需要再发送预检验请求,可以缓存该结果
            httpServletResponse.setHeader("Access-Control-Max-Age", "3600");
    
            //解决预检请求pre-flight的跨域 204表示是否成功,不返回内容
            if ("OPTIONS".equals(httpServletRequest.getMethod())) {
                httpServletResponse.setStatus(org.apache.http.HttpStatus.SC_OK);
                return;
            }
            LOGGER.error("getParameterMap:{}", request.getParameterMap());
            chain.doFilter(request, response);
        }
    
        @Override
        public void destroy() {
    
        }
    
    }

    过滤器配置:

        <!-- 跨域配置 -->    
        <filter>
            <filter-name>crossFilter</filter-name>
            <filter-class>com.wangymd.cors.MyCorsFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>crossFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    项目中使用WebMvcConfigurerAdapter未生效,所以采用javax.servlet.Filter方式。

    WebMvcConfigurerAdapter未生效问题,待处理。。。

  • 相关阅读:
    QPS 与 TPS 简介
    程序员需要学多门语言吗
    Docker 常用命令
    Dockerfile
    Docker-安装与部署
    Docker 容器相关技术
    java多线程 线程八锁
    java多线程 生产者消费者案例-虚假唤醒
    ConcurrentHashMap
    原子变量与CAS算法
  • 原文地址:https://www.cnblogs.com/wangymd/p/14262771.html
Copyright © 2011-2022 走看看