zoukankan      html  css  js  c++  java
  • Java解决跨域问题

    同源

    URL由协议, 域名, 端口组成. 如果两个URL的协议, 域名, 端口相同, 那么这两个URL为同源.

    同源策略

    script, iframe, link 可以跨域加载一些静态资源, 比如脚本语言, CSS, 图片等, 但脚本语言不能访问其他域的HTML文档. 因为同源策略, 所以在客户端和服务器不在同一域下时, 请求需要跨域.

    CORS

    使用CORS解决跨域请求问题, 需要浏览器和服务器同时支持, 目前基本上所有的浏览器都支持CORS通讯过程.

    请求部分由浏览器自动完成, 是否能通过CORS完成跨域请求, 主要看服务器端实现对响应头的修改.

    CORS使用自定义的HTTP头部使客户端与服务器沟通, 在服务器端进行配置. 可以通过filter.

    import java.io.IOException;
    
    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.HttpServletResponse;
    
    public class HeaderCorsFilter implements Filter {
    
        public void init(FilterConfig filterConfig) throws ServletException {
            // TODO Auto-generated method stub
            
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletResponse resp = (HttpServletResponse) response;
            resp.setHeader("Access-Control-Allow-Origin", "*");
            resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            resp.setHeader("Access-Control-Max-Age", "3600");
            resp.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
            resp.setHeader("Access-Control-Allow-Credentials","true");
            chain.doFilter(request, resp);
            
        }
    
        public void destroy() {
            // TODO Auto-generated method stub
            
        }
    }

    Access-Control-Allow-Origin

    添加Origin字段来表明, 请求来自哪个源, 要么是一个请求的范围, 要么是" * ", 表明任意域可以请求. 

    Access-Control-Allow-Credentials

    设置客户端请求是否可以带身份凭证, 是一个boolean类型的值, 如果允许携带, 则Origin的范围不能是" * ".

    Access-Control-Expose-Headers

    XMLHttpRquest对象的getResponse只能获取Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma六个字段, 如果想获取其他的字段, 需要在这里指定.

    Access-Control-Allow-Methods

    设置允许网络请求的方式.

    <filter>
          <filter-name>cors</filter-name>
          <filter-class>HeadercorsFilter</filter-class>
    </filter>
    <filter-mapping>
          <filter-name>cors</filter-name>
          <url-pattern>开放的接口路径</url-pattern>
    </filter-mapping>

     简单请求和非简单请求

    ...

  • 相关阅读:
    最全Pycharm教程
    Django系列:(1)PyCharm下创建并运行我们的第一个Django工程
    用pycharm+django开发web项目
    python在不同层级目录import模块的方法
    Android GetTimeAgo(时间戳转换几天前,几分钟前,刚刚等)
    Fresco简单的使用—SimpleDraweeView
    django常用命令
    Android 浅谈 RxAndroid + Retrofit + Databinding
    云计算之路-阿里云上:负载均衡从七层换成四层后的意外发现团队
    云计算之路-阿里云上:因为网络问题,物理机换回虚拟机团队
  • 原文地址:https://www.cnblogs.com/embraceU/p/9321067.html
Copyright © 2011-2022 走看看