`

spring mvc处理 跨域问题

 
阅读更多

跨域问题

Edit

 

一、概念

       1、跨域:

              是指浏览器对于javascript的同源策略的限制。换句话说这个就是同源策略的保护机制。

              例如a.cn下面的js不能调用b.cn中的js对象或数据(因为a.cn和b.cn是不同域),所以跨域就出现了。

       2、同源策略:

              是指在JS的Ajax请求协议、IP/域名、端口这三项与浏览器上的url地址完全相同,则满足同源策略,既不会出现跨域问题。

 

 列举一些跨域请求,如下:

演示:http://study.cn/json/jsonp/jsonp.html
 请求地址  形式  结果
http://study.cn/test/a.html 同一域名,不同文件夹  成功
http://study.cn/json/jsonp/jsonp.html 同一域名,统一文件夹  成功
http://a.study.cn/json/jsonp/jsonp.html 不同域名,文件路径相同  失败
 http://study.cn:8080/json/jsonp/jsonp.html  同一域名,不同端口  失败
https://study.cn/json/jsonp/jsonp.html  同一域名,不同协议    失败
 
 
 
 
 

二、突破跨域限制的解决方案

           1、 跨域源资源共享(CORS):

              CORS即Cross Origin Resource Sharing(跨域源资源共享),通俗说就是我们所熟知的跨域请求。众所周知,在以前,跨域可以采用代理、JSONP等方式,而在Modern浏览器面前,这些终将成为过去式,因为有了CORS。

              CORS在最初接触的时候只大概了解到,通过服务器端设置Access-Control-Allow-Origin响应头,即可使指定来源像访问同源接口一样访问跨域接口,最近在使用CORS的时候,由于需要传输自定义Header信息,发现原来CORS的规范定义远不止这些。

              CORS可以分成两种:

                   1、简单请求

                          HEAD、GET、POST

                         这类简单请求,只需要一次请求,后端响应的head部分携带一下信息就可以通过

                          Access-Control-Allow-Origin:*

                          Access-Control-Allow-Methods: HEAD,GET,POST

                          Access-Control-Max-Age: 3600

                          Access-Control-Expose-Headers:Origin, X-Requested-With, Content-Type, Accept

                          当你需要访问额外的信息时,就需要在 Access-Control-Expose-Headers 这一项当中填写并以逗号进行分隔。
                 

                   2、复杂请求

                          PUT,PATCH, DELETE, OPTIONS等

                        这类复杂的跨域问题,表面上看起来和简单请求使用上差不多,但实际上浏览器发送了不止一个请求。

                                1、首先,发送的是一种OPTIONS的"预请求",单服务端返回"预回应"结果为通过(告诉前端我是否允许你跨域访问某资源)

                                2、 然后,发送最终想要发送的跨域资源请求。

                          预请求实际上是对服务端的一种权限请求的询问,只有当预请求通过,前端才会实际发送最终的请求。

                          这类复杂请求,需要最少一次以上的请求,后端响应的head部分携带一下信息才可以通过。

                          Access-Control-Allow-Origin:*

                          Access-Control-Allow-Methods: PUT,PATCH,DELETE,OPTIONS

                          Access-Control-Max-Age: 3600

                          Access-Control-Expose-Headers:Origin, X-Requested-With, Content-Type, Accept

                          同理,当你需要访问额外的信息时,也需要在 Access-Control-Expose-Headers 这一项当中填写并以逗号进行分隔。Allow-Method中添加options和Expose-Headers添加Origin,都是为了后端正确响应"预请求"的。所以一定注意不要遗漏了,否则必然导致复杂跨域请求不成功。

 

三、跨域问题解决方案

            Spring MVC 4.2版本后提供了完善的跨域解决方案,具体实体方式如下:

            1、application.xml 添加如下配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd  
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd"
    default-lazy-init="false">

    <mvc:annotation-driven />

    <mvc:cors>
        <mvc:mapping path="/**" allowed-origins="*"
            allowed-methods="GET, POST, PUT, PATCH, DELETE, OPTIONS"
            allowed-headers="ticket,digest,Origin,Accept,Content-Type,X-Requested-With,Transfer-Encoding,Date,status,Server"
            exposed-headers="ticket,digest,Origin,Accept,Content-Type,X-Requested-With,Transfer-Encoding,Date,status,Server"
            allow-credentials="true" max-age="3600" />
    </mvc:cors>
</beans>

 
 
 
 
 
 
 
 
 
 

            2、web.xml 添加如下配置,作用是开启OPTIONS请求,因为默认SpringMVC是关闭了OPTIONS请求的。

<!-- springMvc -->
    <servlet>
        <servlet-name>springMvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>dispatchOptionsRequest</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
分享到:
评论

相关推荐

    基于Spring和Spring MVC实现可跨域访问的REST服务

    要解决跨域问题,Spring提供了CORS(Cross-Origin Resource Sharing)支持。默认情况下,浏览器阻止跨域请求,但我们可以配置Spring MVC来允许特定来源的请求。这通常通过`@CrossOrigin`注解实现,可以应用于...

    详解Spring MVC CORS 跨域

    详解 Spring MVC CORS 跨域 在 Web 开发中,跨域资源共享(Cross-origin resource sharing,CORS)是一个非常重要的概念。它允许 Web 应用程序可以访问不同域名下的资源,而不受同源策略的限制。今天,我们主要介绍...

    springmvc跨域处理和过滤器方式跨域处理主要代码

    在Spring MVC中,跨域问题通常发生在Web应用中,当客户端(如JavaScript的Ajax请求)尝试从一个域名访问另一个域名的资源时。由于浏览器的安全策略,这种行为默认是被禁止的,这被称为“同源策略”。然而,在现代Web...

    Spring MVC整合shiro

    Spring MVC 是一款强大的MVC框架,用于构建企业级的Web应用程序,而Apache Shiro则是一款安全框架,负责处理身份验证、授权(权限控制)、会话管理和安全性相关的其他功能。将两者整合可以实现一个完整的基于角色的...

    spring MVC cors跨域实现源码解析

    `AbstractHandlerMapping`、`RequestMappingHandlerMapping`、`CorsInterceptor`、`PreFlightHandler`等:这些类在Spring MVC的请求处理链中起到了关键作用,如读取`@CrossOrigin`注解信息和从XML文件中解析跨域配置...

    Spring MVC中自带的跨域问题解决方法

    总的来说,Spring MVC的`@CrossOrigin`注解提供了一种简单而有效的方式来处理跨域问题,使得前端和后端的跨域通信变得更加顺畅。通过合理的配置,开发者可以根据实际需求灵活控制跨域策略,保证了前后端交互的正常...

    Spring MVC 与 CORS跨域的详细介绍

    Spring MVC 与 CORS 跨域的详细介绍 本文对 Spring MVC 与 CORS 跨域的详细介绍,包括 CORS 的知识点和如何在 Spring MVC 中配置 CORS。 CORS 简介 同源策略(same origin policy)是浏览器安全的基石。在同源...

    spring MVC uploadify

    在Spring MVC中,处理文件上传是一项常见的任务,尤其在需要用户交互上传图片或文档的场景下。`multipartResolver`是Spring MVC中处理多部分(multipart)HTTP请求的关键组件,它允许用户上传文件作为请求的一部分。...

    在 Spring Web MVC 环境下使用 Dojo

    4. **Spring MVC 控制器**:创建 Spring MVC 控制器处理前端请求,返回 JSON 数据供 Dojo 控件使用。可以使用 `@ResponseBody` 注解配合 `@RequestMapping` 注解来实现。 5. **数据绑定**:Dojo 控件如 DataGrid ...

    spring-mvc-showcase-case1-client

    Spring MVC的核心组件包括DispatcherServlet、Controller、ModelAndView以及ViewResolver等,它们共同协作,实现了请求的分发、业务逻辑处理及视图呈现。 接下来是AngularJS,这是一个强大的JavaScript框架,用于...

    兼容IE6的spring mvc框架

    综上所述,实现一个兼容IE6的Spring MVC 3.2框架应用,需要深入理解Spring MVC的特性和机制,同时解决老旧浏览器带来的兼容性问题,以及实施有效的双语切换策略。这需要开发者具备扎实的前端和后端技术基础,以及对...

    spring mvc 使用教程

    Spring MVC 是一个基于 Java 的轻量级Web应用框架,它主要负责处理后端的业务逻辑,与前端进行交互。在本教程中,我们将深入探讨如何使用 Spring MVC 进行开发。 1. **Spring MVC 概述** Spring MVC 是 Spring ...

    cors-filter-1.7.jar spring解决跨域问题 java

    在Spring MVC的Controller或者Controller方法上使用`@CrossOrigin`注解,可以直接指定允许跨域的源、请求方法、请求头等信息。例如: ```java @RestController @CrossOrigin(origins = "http://example.com") ...

    Spring实现处理跨域请求代码详解

    Spring实现处理跨域请求代码详解 Spring实现处理跨域请求代码详解是指在Spring框架中如何处理跨域请求,以便让客户端可以跨域访问...我们可以使用CORS协议来解决跨域问题,并使用Spring框架来实现处理跨域请求的功能。

    spring mvc 3.2 rest配置 文件

    7. **CORS支持** - 对于跨域资源共享(CORS),Spring MVC提供了`CorsRegistry`和`CorsConfiguration`来配置允许哪些来源进行访问。 8. **Validation** - 使用JSR-303/JSR-349提供的注解进行数据验证,例如`@Not...

    Spring MVC中处理ajax请求的跨域问题与注意事项详解

    本文将深入探讨Spring MVC中处理Ajax跨域问题的方法以及需要注意的事项。 **为何出现跨域** 跨域是由浏览器的安全策略——同源策略(Same-origin policy)导致的。它限制了一个源(协议+域名+端口)的文档或脚本...

    ajaxupload在spring mvc4.2中实现简单文件上传

    综上所述,实现AjaxUpload在Spring MVC 4.2中的文件上传涉及前端的Ajax请求、后端的控制器处理、配置文件上传支持、异常处理以及文件存储等多个环节。这个过程需要对Spring MVC和前端交互有深入的理解。希望上述信息...

    spring4.3 实现跨域CORS的方法

    Spring 4.3 框架中实现跨域 CORS 的方法是一种常用的解决跨域问题的方法。CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种机制,它允许服务器指定可以访问其资源的外域(origin)。在 Spring 4.3 框架中...

    spring mvc spring uploadfiles 插件 实现多附件和存文本同时上传解决代码(实战项目)

    确保Spring MVC已经正确配置并能够处理文件上传。这通常涉及到在配置文件中添加相应的bean,例如: ```java @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Bean public Multipart...

    uploadify [解决spring MVC上传配置冲突]

    然而,当引入Uploadify时,冲突可能会出现,因为Uploadify使用了其自身的异步上传机制,这可能与Spring MVC的默认处理方式不兼容。解决这个问题的方法是在`Controller`中调整代码,以适应Uploadify的异步请求。 在...

Global site tag (gtag.js) - Google Analytics