1. 程式人生 > 其它 >HTTP1.0和HTTP1.1和HTTP2.0的區別

HTTP1.0和HTTP1.1和HTTP2.0的區別

. 什麼是跨域

  • 要了解跨域,先要知道同源策略。同源策略是由 Netscape 公司提出的一個著名的安全策略,所有支援 JavaScript 的瀏覽器都會使用這個策略。所謂同源是指:協議,域名,埠 全部相同。

  • 瀏覽器從一個域名的網頁去請求另一個域名的資源時,協議,域名,埠任意不同,都會出現跨域問題。

  • 現實工作開發中經常會有跨域的情況。因為公司會有很多專案,也會有很多子域名,各個專案或者網站之間需要相互呼叫對方的資源,所以跨域請求是避免不了的


2. 解決跨域的幾種方案

方法一:註解

在Spring Boot 中給我們提供了一個註解 @CrossOrigin 來實現跨域,這個註解可以實現方法級別的細粒度的跨域控制。我們可以在類或者方新增該註解,如果在類上新增該註解,該類下的所有介面都可以通過跨域訪問,如果在方法上添加註解,那麼僅僅只限於加註解的方法可以訪問。

示例:
    @RestController
    @RequestMapping("/user")
    @CrossOrigin
    public class UserController {
       @Autowired
        private UserService userService;

       @RequestMapping("/findAll")
        public Object findAll(){
            return userService.list();
        }
    }

方法二:實現 WebMvcConfigurer

這裡可以通過實現 WebMvcConfigurer 介面中的 addCorsMappings() 方法來實現跨域。

    @Configuration
    public class WebConfig implements WebMvcConfigurer {

        /**
         * 跨域支援
         * @param registry
         */
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowCredentials(true)
                    .allowedMethods("GET", "POST", "DELETE", "PUT")
                    .allowedHeaders(*)
                    .maxAge(3600 * 24);
        }
    }

addMapping:配置可以被跨域的路徑,可以任意配置,可以具體到直接請求路徑。
allowedOrigins:允許所有的請求域名訪問我們的跨域資源,可以固定單條或者多條內容,如:"http://www.baidu.com",只有百度可以訪問我們的跨域資源。
allowCredentials: 響應頭表示是否可以將對請求的響應暴露給頁面。返回true則可以,其他值均不可以
allowedMethods:允許輸入引數的請求方法訪問該跨域資源伺服器,如:POST、GET、PUT、OPTIONS、DELETE等。
allowedHeaders:允許所有的請求header訪問,可以自定義設定任意請求頭資訊,如:"X-YAUTH-TOKEN"
maxAge:配置客戶端快取預檢請求的響應的時間(以秒為單位)。預設設定為1800秒(30分鐘)。


方法三:Nginx 配置解決跨域問題

如果我們在專案中使用了Nginx,可以在Nginx中新增以下的配置來解決跨域

    location / {
       add_header Access-Control-Allow-Origin *;
       add_header Access-Control-Allow-Headers X-Requested-With;
       add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

       if ($request_method = 'OPTIONS') {
         return 204;
       }
    }

方法四:Filter

我們可以通過實現Fiter介面在請求中新增一些Header來解決跨域的問題:

@Component
public class CORSFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Credentials", "true");
        res.addHeader("Access-Control-Allow-Origin", "*");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
            response.getWriter().println("ok");
            return;
        }
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
}