zoukankan      html  css  js  c++  java
  • Java服务器端如何实现跨越

    我们开发H5项目,通过JS调用某个远程接口时经常会出现这跨域的问题,一般的解决办法就是在服务器增加对请求头的判断。

    这里我们讲一下在java中通过filter过滤器如何实现;当然,你也可以在nginx中配置,或者使用jsonp实现。

    1、假如我命名为:CorsFilter.java

    public class CorsFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse res = (HttpServletResponse) response;
            res.setContentType("application/json;charset=UTF-8");
            res.setHeader("Access-Control-Allow-Origin", "*");
            res.setHeader("Access-Control-Allow-Methods", "POST, GET");
            res.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
            res.setHeader("Access-Control-Max-Age", "604800");
            chain.doFilter(request, response);
    
            /* 跨域配置说明
             * Access-Control-Allow-Origin  设置允许跨域的白名单,在白名单里的跨域请求是允许的。
             * Access-Control-Allow-Methods 设置接受的方法,这里只接受POST方法。
             * Access-Control-Allow-Headers 设置接受的请求头,用逗号分隔。
             * Access-Control-Allow-Max-Age 设置预检的有效期,单位为秒。发送正式请求前,浏览器会预先发送一个预检请求,如果服务器返回了上述信息,表明是可以跨越请求的,然后才会正式发送请求。预检成功后,在有效期内就不用再发送了。
             * Access-Control-Allow-Credentials 设置是否允许客户端携带验证信息
             */
        }
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
        }
    }

    这里我们提一下:Access-Control-Allow-Origin 这个配置,他是表示允许的白名单,“ * ” 表示不限。

    这是一种比较粗暴的设置,容易引起DDOS攻击,所以,最好还是进行指定域名,如:Access-Control-Allow-Origin: "http://www.domain.com/"

    但是,如果有多个域名怎么办?这里需要做一下判断,动态赋一下值。

        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse res = (HttpServletResponse) response;
            String[] allowDomain = {"http://www.domain1.com", "http://www.domain2.com"};
            Set<String> allowedOrigins = new HashSet<String>(Arrays.asList(allowDomain));
            String originHeader = ((HttpServletRequest) request).getHeader("Origin");
            if (allowedOrigins.contains(originHeader)) {
                res.setHeader("Access-Control-Allow-Origin", originHeader);
                res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
                res.setHeader("Access-Control-Max-Age", "3600");
                res.setHeader("Access-Control-Allow-Headers", "content-type, x-requested-with");
                res.setHeader("Access-Control-Allow-Credentials", "true");
            }
            chain.doFilter(request, response);
        }

    2、在web.xml中配置如下

    <!-- 跨域过滤器 -->
    <filter>
        <filter-name>cors</filter-name>
        <filter-class>com.domian.controller.filter.CorsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cors</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    欢迎关注我的公众号:云栖语,不一样的研发视界。
    云栖语微信公众号:change-1978
  • 相关阅读:
    js笔记18
    (6)《Head First HTML与CSS》学习笔记---结尾、《HTML5权威指南》读书笔记
    (5)《Head First HTML与CSS》学习笔记---布局与定位
    一些效果实现
    高效程序员的45个习惯·敏捷开发修炼之道(Practices of an Agile Developer)读书笔记
    (4)《Head First HTML与CSS》学习笔记---文本的CSS规则和盒模型;div与span;<a>元素的链接色;伪类
    酷壳上的几篇文章
    《Head First HTML与CSS》的CSS属性
    (3)《Head First HTML与CSS》学习笔记---CSS入门
    (2)《Head First HTML与CSS》学习笔记---img与基于标准的HTML5
  • 原文地址:https://www.cnblogs.com/hunttown/p/15587231.html
Copyright © 2011-2022 走看看