精华内容
下载资源
问答
  • Java 解决跨域请求

    2019-09-14 18:02:02
    被调用方自适应调用方请求域 该方法只需要修改被调用方的后台代码,调用方可依照正常的ajax访问数据 无序列表我们以spring-boot框架为例子,首先,在后台创建一个跨域处理过滤器,代码如下 import...

    不多说,直接上代码。

     

    • 被调用方自适应调用方请求域
      • 该方法只需要修改被调用方的后台代码,调用方可依照正常的ajax访问数据
      • 无序列表我们以spring-boot框架为例子,首先,在后台创建一个跨域处理过滤器,代码如下
        • import org.springframework.util.StringUtils;
          import javax.servlet.*;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import java.io.IOException;
          
          /**
           * 跨域请求处理
           */
          public class CrosFilter implements Filter {
          
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
          
              }
          
              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  HttpServletResponse response = (HttpServletResponse) servletResponse;
                  HttpServletRequest request = (HttpServletRequest) servletRequest;
          
                  String origin = request.getHeader("Origin");
                  if(!StringUtils.isEmpty(origin)){
                      //但请求带有cookie的时候,origin不能为*,必须是全匹配名
                      response.addHeader("Access-Control-Allow-Origin",origin);
                  }
          
                  response.addHeader("Access-Control-Allow-Methods","*");
          
                  String header = request.getHeader("Access-Control-Allow-Headers");
                  //匹配所有自定义请求头
                  if(!StringUtils.isEmpty(header)){
                      response.addHeader("Access-Control-Allow-Headers",header);
                  }
          
                  //代表着浏览器请求第一次之后,一个小时之内可以缓存请求信息,不需要在发送预检命令
                  response.addHeader("Access-Control-Max-Age","3600");
          
                  //当请求带cookie的时候,需要将Credentials设置为true
                  response.addHeader("Access-Control-Allow-Credentials","true");
          
                  filterChain.doFilter(servletRequest,servletResponse);
              }
          
              @Override
              public void destroy() {
          
              }
          }

           

      • 下一步是在启动类里面配置过滤器
        • import org.mybatis.spring.annotation.MapperScan;
          import org.springframework.boot.SpringApplication;
          import org.springframework.boot.autoconfigure.SpringBootApplication;
          import org.springframework.boot.web.servlet.FilterRegistrationBean;
          import org.springframework.context.annotation.Bean;
          import springfox.documentation.swagger2.annotations.EnableSwagger2;
          
          @SpringBootApplication
          @EnableSwagger2
          @MapperScan("com.vcyber.mapper")
          public class UserApplication {
          
             public static void main(String[] args) {
                SpringApplication.run(UserApplication.class, args);
             }
          
             /**
              * 处理跨域
              * @return
              */
             @Bean
             public FilterRegistrationBean registrationBean(){
                FilterRegistrationBean bean = new FilterRegistrationBean();
          
                bean.addUrlPatterns("/*");
                bean.setFilter(new CrosFilter());
                return bean;
             }
          }

           

      • 到这里使用过滤器处理跨域请求的方法就完成了,这种方式适用于任务一种请求,实用性比Jsonp要好,推荐使用。
    • spring框架处理跨域
      • 上面我们讲的两种处理方式都是适用后台任何一种框架,而我们的spring框架提供了一种框架自带的解决方式。
      • 就是在我们提供被请求的类或者方法上面添加一个@CrossOrigin注解,如:
        • @RestController
          @RequestMapping("loginrecord")
          @CrossOrigin
          public class LoginRecordController {
          }

        • @RestController
          @RequestMapping("loginrecord")
          public class LoginRecordController {
          @GetMapping("getMybatisLoginList")
          @CrossOrigin
          public ResponseData getMybatisLoginList(){
              ResponseData responseData = new ResponseData();
              responseData.setCode("200");
              responseData.setMessage("成功");
              responseData.putDataValue("list",loginRecordMapper.selectList(null));
              return responseData;
          }
          }

           

      • 在类上面加上@CrossOrigin注解,则表示该类里面的所有方法都支持跨域请求,如果在指定方法上加注解,则说明该方法支持跨域请求
    • Jsonp
      • 前台使用ajax的jsonp方式访问请求
        • $.ajax({
          		type:"get",
          		url:"http://localhost:8080/loginrecord/getMybatisLoginList",
          		dataType:"jsonp",
          		jsonp:"callback",
          		success:function(result){
          			alert(result)
          		}

           

      • 后台需要添加一个JsonP处理类
        • import org.springframework.web.bind.annotation.ControllerAdvice;
          import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;
          
          @ControllerAdvice
          public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
          
              public JsonpAdvice(){
                  super("callback");
              }
          }

           

      • 注意:1.JsonpAdvice构造函数所返回的数据必须与前端ajax的jsonp属性数据一致
                   2.Jsonp只支持GET请求,所以面对多种请求方式的时候,不建议使用,可采用别种方式

         

    转载于:https://my.oschina.net/u/3174004/blog/2966833

    展开全文
  • import org.springframework.util.StringUtils;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet....import java.io.IOException;/*** 跨域请求处理*/pu...

    import org.springframework.util.StringUtils;

    import javax.servlet.*;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import java.io.IOException;

    /**

    * 跨域请求处理

    */

    public class CrosFilter implements Filter {

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    HttpServletResponse response = (HttpServletResponse) servletResponse;

    HttpServletRequest request = (HttpServletRequest) servletRequest;

    String origin = request.getHeader("Origin");

    if(!StringUtils.isEmpty(origin)){

    //但请求带有cookie的时候,origin不能为*,必须是全匹配名

    response.addHeader("Access-Control-Allow-Origin",origin);

    }

    response.addHeader("Access-Control-Allow-Methods","*");

    String header = request.getHeader("Access-Control-Allow-Headers");

    //匹配所有自定义请求头

    if(!StringUtils.isEmpty(header)){

    response.addHeader("Access-Control-Allow-Headers",header);

    }

    //代表着浏览器请求第一次之后,一个小时之内可以缓存请求信息,不需要在发送预检命令

    response.addHeader("Access-Control-Max-Age","3600");

    //当请求带cookie的时候,需要将Credentials设置为true

    response.addHeader("Access-Control-Allow-Credentials","true");

    filterChain.doFilter(servletRequest,servletResponse);

    }

    @Override

    public void destroy() {

    }

    }

    展开全文
  • 要知道跨域请求就要先了解同源策略,那么什么是同源?什么是不同源?简单来说就是,如果两个资源,包括HTML页面、JavaScript脚本、css样式,对应的协议、域名和端口完全相同,那么这两个资源就是同源的,Same-origin...

    要知道跨域请求就要先了解同源策略,那么什么是同源?什么是不同源?简单来说就是,如果两个资源,包括HTML页面、JavaScript脚本、css样式,对应的协议、域名和端口完全相同,那么这两个资源就是同源的,Same-origin policy解释得很清楚。那么同源策略的意思就是一个源中的资源访问另外一个源中的资源,在在这一点上JavaScript的跨站资源访问表现的更加明显。在HTML5之前Ajax是不允许发起跨站请求的,如果有需求的话,可以使用JSONP等方法,但是缺点就是:

    只支持Get不支持Post;

    本质上是脚本注入的方式,存在安全隐患;

    还有JSONP的优缺点,但是自从HTML5出现之后,提出了CORS(跨站资源共享)这种方式,极大地方便了日常的开发。如果要理解CORS的工作原理,首先要知道跨域访问是怎么被禁止的,之前本屌丝一直以为是前台的跨域访问请求不能发出去,是实现同源策略的浏览器拦截了该请求,但是后来才知道浏览器并没有拦截请求,而是拦截了服务器端返回的响应。

    所以如果要支持跨域访问,需要浏览器和后台服务器程序同时支持,如果这两个条件不能同时满足,则还是不能支持跨域访问。

    用于CORS中的Http的首部有如下几个:

    响应头

    Access-Control-Allow-Origin: 允许跨域访问的域,可以是一个域的列表,也可以是通配符”*”;

    Access-Control-Allow-Methods: 允许使用的请求方法,以逗号隔开;

    Access-Control-Allow-Headers: 允许自定义的头部,以逗号隔开,大小写不敏感;

    Access-Control-Expose-Headers: 允许脚本访问的返回头,请求成功后,脚本可以在XMLHttpRequest中访问这些头的信息

    Access-Control-Allow-Credentials: 是否允许请求带有验证信息,XMLHttpRequest请求的withCredentials标志设置为true时,认证通过,浏览器才将数据给脚本程序。

    Access-Control-Max-Age: 缓存此次请求的秒数。在这个时间范围内,所有同类型的请求都将不再发送预检请求而是直接使用此次返回的头作为判断依据,非常有用,大幅优化请求次数;

    请求头

    Origin: 普通的HTTP请求也会带有,在CORS中专门作为Origin信息供后端比对,表明来源域,要与响应头中的Access-Control-Allow-Origin相匹配才能进行跨域访问;

    Access-Control-Request-Method: 将要进行跨域访问的请求方法,要与响应头中的Access-Control-Allow-Methods相匹配才能进行跨域访问;

    Access-Control-Request-Headers: 自定义的头部,所有用setRequestHeader方法设置的头部都将会以逗号隔开的形式包含在这个头中,要与响应头中的Access-Control-Allow-Headers相匹配才能进行跨域访问

    从支持跨域访问的范围说,可以有整个服务器、单个应用程序、单个接口。

    1、在整个服务器上支持跨域访问

    在服务器上可以部署多个应用程序,如果在整个服务器的范围上支持跨域访问,那么在所有应用程序上都不用单独配置了,直接使用服务器的配置即可,这里通过tomcat来进行举例。在Tomcat7之后包括tomcat7才开始支持CORS,之前的版本是不支持的。配置CORS,首先配置Tomcat中的conf\web.xml,在其中添加一个Filter声明,如下:

    CORS

    com.thetransactioncompany.cors.CORSFilter

    CORS

    /*

    这样就能应用到在该Tomcat中部署的所有的应用程序的接口上。然后在Tomcat的lib文件夹下加入两个jar包:cors-filter-2.5.jar和java-property-utils-1.9.jar,这两个jar包对应的maven依赖如下:

    com.thetransactioncompany

    cors-filter

    2.5

    在Tomcat服务器上配置完成后,在自己的应用程序上就不要再配置有关跨域访问的内容了,这样会造成访问相应的接口时不支持跨域访问。

    这种配置方式覆盖面太广,有些部署在该服务器下的应用程序根本不需要支持跨域访问,就会带来一些安全问题,所以其实不推荐使用这种配置方式。

    2在整个后台应用上支持跨域访问

    在这个应用程序的范围内支持跨域访问是比较常见的使用方法,而且这种配置有很多实现方式。

    2.1、在web.xml中配置

    将在上述服务器中的web.xml上配置的filter,配置到自己的工程中。然后加入maven依赖,如下类似:

    com.thetransactioncompany

    cors-filter

    2.5

    这样就完成了对跨域访问请求的支持,如果并不想对所有的请求都支持跨域访问,则可以在Filter的url-pattern中改变匹配到的url地址。

    2.2、通过WebMvcConfigurer ###

    在Spring中,使用这个接口可以通过定义回调方法来进行一些Spring MVC中要用到的配置,在里面用来支持CORS的方法是addCorsMappings(CorsRegistry registry),我们并不直接使用这个接口而是使用它的抽象实现类WebMvcConfigurerAdapter,这个类中给我们提供了WebMvcConfigurer接口中方法的空实现,我们可以直接填上自己的业务逻辑就可以直接使用。在这个回调方法中的参数是CorsRegistry,这个类可以帮助我们为相应的url地址提供CORS配置,关于这个方法可以放到Application启动类中,也可以单独放到一个类中。

    在Application启动类中使用该方法,只需要在Application启动类中加入如下代码即可。

    @Bean

    public WebMvcConfigurer corsConfigurer() {

    return new WebMvcConfigurerAdapter() {

    @Override

    public void addCorsMappings(CorsRegistry registry) {

    registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");

    }

    };}

    独自建立新类使用该方法,则需要配置一些注解,如下:

    @Configuration@EnableWebMvc

    @ComponentScan(basePackages = { "com.springboot.demo" })

    public class WebConfig extends WebMvcConfigurerAdapter {

    @Override

    public void addCorsMappings(CorsRegistry registry) {

    registry.addMapping("/*").allowedOrigins("http://localhost:8070");

    }

    }

    与在Application启动类中使用相比多了@Configuration和@EnableWebMvc注解,这是因为@SpringBootApplication已经包含上述两个注解了,所以不需要重新加入。

    在CorsRegistry中调用addmapping后会得到CorsRegistration类,这时候就可以使用链式调用可以对这个CORS配置进行origin、method、header、maxage等的限制,这里就不展开了。

    2.3 自定义Filter

    所有的方法归根结底就是拦截对接口的访问,所以如果你不想麻烦并且想深入了解CORS到底是怎样工作的,可以通过自定义Filter来实现,其实这也没有什么难的,就是在拦截器上通过对请求和响应加上一些Headers,这里就不说了。

    3、在单个接口上支持跨域访问

    跨域访问所支持的最小的范围就是在Controller以及对应的方法上,这里使用@CrossOrigin注解来完成相应的配置,首先来看看这个注解的源代码。

    @Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)

    @Documented

    public @interface CrossOrigin {

    String[] DEFAULT_ORIGINS = { "*" };

    String[] DEFAULT_ALLOWED_HEADERS = { "*" };

    boolean DEFAULT_ALLOW_CREDENTIALS = true;

    long DEFAULT_MAX_AGE = 1800;

    String[] value() default {};

    @AliasFor("value")

    String[] origins() default {};

    String[] allowedHeaders() default {};

    String[] exposedHeaders() default {};

    RequestMethod[] methods() default {};

    String allowCredentials() default "";

    long maxAge() default -1;}

    从该注解中可以看到,它可以使用在方法上,也可以使用在类上,并且已经完全覆盖了CORS提出的响应头首部。

    使用在类上,一般使用在有@Controller或者@RestController注解的类上,这样在该类上全部遵从该注解提供的关于CORS的配置。

    使用在方法上,该CORS的配置只是针对该指定的方法;

    默认情况下,@CrossOrigin支持所有的origin和所有的headers来进行跨域访问,而且它所限制的方法是由@Requestmapping中的method属性来提供的。

    如果查看源码的话是可以发现的,在CorsRegistry中使用addMapping()配置映射时,返回的CorsRegistration类中对origin、header、Credentials的配置使用的就是@CrossOrigin的默认配置。实例如下:

    @CrossOrigin(origins={"http://localhost:8070"}, methods={RequestMethod.GET, RequestMethod.POST})

    @RequestMapping("/")@ResponseBody

    public String getInformation(){

    restHandleService.getRestInformation();

    return "spring boot";

    }

    相关文章:http://blog.csdn.net/lmy86263/article/details/51724221

    展开全文
  •   传统的跨域请求没有好的解决方案,无非就是jsonp和iframe,随着跨域请求的应用越来越多,W3C提供了跨域请求的标准方案(Cross-Origin Resource Sharing)。IE8、Firefox 3.5 及其以后的版本、Chrome浏览器、...

    java后台跨域请求

      传统的跨域请求没有好的解决方案,无非就是jsonp和iframe,随着跨域请求的应用越来越多,W3C提供了跨域请求的标准方案(Cross-Origin Resource Sharing)。IE8、Firefox 3.5 及其以后的版本、Chrome浏览器、Safari 4 等已经实现了 Cross-Origin Resource Sharing 规范,实现了跨域请求。

      在服务器响应客户端的时候,带上Access-Control-Allow-Origin头信息。

    • 如果设置 Access-Control-Allow-Origin:*,则允许所有域名的脚本访问该资源。
    • Access-Control-Allow-Origin:http://www.phpddt.com.com,允许特定的域名访问。

      以一个servlet响应为例

            // 返回给浏览器
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html");
    
    展开全文
  • 只需一行代码就能解决跨域 只用修改后端, 前端不用处理, 适用于JAVA.SpringMVC 包括SpringBoot与SSM都适用 给Controller添加注解 生效的只有一个注解, 在SpringBoot中无需额外的包 @CrossOrigin 完整代码 @Cross...
  • Java Web解决跨域请求

    2019-08-30 10:35:55
    要知道跨域请求就要先了解同源策略,那么什么是同源?什么是不同源?简单来说就是,如果两个资源,包括HTML页面、JavaScript脚本、css样式,对应的协议、域名和端口完全相同,那么这两个资源就是同源的,Same-origin...
  • 1.web.xml加入以下节点,,一定放在第一个filterCorsFilterorg.apache.catalina.filters.CorsFilterCorsFilter/*2.ajax添加参数原生ajax请求方式:var xhr = new XMLHttpRequest();xhr.open("POST", ...
  • 同源URL由协议, 域名, 端口组成. 如果两个URL的协议, 域名, 端口相同, 那么这两个... 因为同源策略, 所以在客户端和服务器不在同一域下时, 请求需要跨域.CORS使用CORS解决跨域请求问题, 需要浏览器和服务器同时支持,...
  • 一、跨域问题的来源 浏览器跨域处理原由:浏览器安全防护的“同源政策”影响。...跨域请求的限制主要是针对前端,Java后端发送Http请求是不存在跨域的问题的,所以通过后端发送Http跨域请求也是解决跨域的一种方式...
  • Java中SSM框架解决跨域请求:https://blog.csdn.net/AdminGuan/article/details/100184012
  • 讲解比较详细易懂https://blog.csdn.net/dreamcatcher1314/article/details/78652884跨域请求的限制主要是针对前端,Java后端发送Http请求是不存在跨域的问题的,所以通过后端发送Http跨域请求也是解决跨域的一种...
  • 我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。...要知道跨域请求就要先了解同源策略,那么什么是同源?什么是不同源?简单来说就是,如果两...
  • 这篇文章主要介绍了使用Cors实现JavaWeb跨域请求问题的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下之前用jsonp解决跨域问题,现在用CORS实现跨域请求解决java跨域问题:主要代码如下packagecom.hy....
  • 那什么是跨域请求??我们又什么时候需要用到跨域请求呢??? 什么是跨域请求 跨域请求是来自于浏览器的同源机制,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。在通信不被允许的...
  • 场景:web系统跨域请求访问订单系统,在订单系统中修改商品库存,修改成功,也就是事务提交成功。当订单系统将result返回给web系统时,请求出现了异常,导致web系统没有获取到这个result,但是在订单系统已经修改了...
  • java解决请求跨域问题,有以下两种写法1.使用拦截器,实现javax.servlet.Filter接口import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet....
  • 今天刚在项目中解决跨域,记录下javascript首先了解下相关知识html$.ajax jQuery的异步请求前端jsonp :指定跨域异步请求时,后台接收参数名称,默认为callbackdataType:请求数据类型 -- 经常使用json,text,html ...
  • 自己做网站的时候,经常遇到跨域问题,下面是平时多次实践总结出的解决方法,大家有什么更好的思路,可以相互交流下~ XMLHttpRequest cannot load ...
  • 1.什么是跨域 跨域是指跨域名的访问,以下情况都属于跨域跨域现象 实例 域名不相同 www.baidu.com与www.taobao 一级域名相同,但是端口...注:如果域名与端口均相同,只是请求的路径...
  • Java解决请求跨域问题

    2020-09-22 10:37:20
    Java解决跨域问题 跨域是什么? 跨域(Access-Control-Allow-Origin),指的是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指,域名,协议,端口均相同;所有只要域名,协议,端口有所不同就会...
  • SpringMVC中有个@CrossOrigin注解, 加上这个注解后,跨域请求就不会再报错了
  • 网上很多解决跨域拦截的案例:我这里也是自己鼓捣之后才解决的,仅供借鉴,酌情拷贝。 1、对请求和响应进行重写 /** * author: CHY * touse: 解决浏览器跨域问题(拦截器) * * response.addHeader("Access-...
  • java解决请求跨域问题,有以下两种写法1.使用拦截器,实现javax.servlet.Filter接口import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet....
  • java解决请求跨域问题,有以下两种写法1.使用拦截器,实现javax.servlet.Filter接口import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 781
精华内容 312
关键字:

java解决跨域请求

java 订阅