ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java服务器端如何实现跨越

2021-11-22 10:02:16  阅读:162  来源: 互联网

标签:Control Access Java 服务器端 Origin res 跨越 Allow setHeader


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

 

标签:Control,Access,Java,服务器端,Origin,res,跨越,Allow,setHeader
来源: https://www.cnblogs.com/hunttown/p/15587231.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有