代码改变世界

Java服务器端如何实现跨越

2021-11-22 09:52  猎手家园  阅读(61)  评论(0编辑  收藏  举报

我们开发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