「java跨域问题怎么解决」java跨域访问四种方式

博主:adminadmin 2023-03-22 07:54:05 790

今天给各位分享java跨域问题怎么解决的知识,其中也会对java跨域访问四种方式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

同源策略与跨域问题解决

如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的 源 。

举个例子:

下表给出了相对 同源检测的示例:

由同源策略导致的的AJAX请求失败

例如:页面路径为:

后台接口地址为:

产生的结果:

此即为跨域请求失败

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了AJAX只能 同源 使用的限制。

在此之前,需要知道 简单请求、复杂请求

简单请求:

某些请求不会触发 CORS 预检请求 。本文称这样的请求为“简单请求”,请注意,该术语并不属于 Fetch (其中定义了 CORS)规范。若请求满足所有下述条件,则该请求可视为“简单请求”:

复杂请求:

与前述简单请求不同,“需预检的请求”要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。当请求满足下述任一条件时,即应首先发送预检请求:

若需要跨域,则需要在请求头里添加 Origin 字段

请求至后台若符合后台请求规则则可成功请求,并且后台会返回相应的规则

当请求为复杂请求时,浏览器会在请求前先发送一个 OPTIONS 请求

OPTIONS 是一个预检请求,与简单请求不同的是它会额外携带两个参数: Access-Control-Request-Method :该次请求的请求方式 Access-Control-Request-Headers :该次请求的自定义请求头字段

OPTIONS 发送至后台若后台成功响应,则继续发送复杂请求,若响应失败则不会发送复杂请求

继续发送复杂请求

(1)、OPTIONS不会携带body若后台方法上使用@RequestBody注解,则会报错:

例如:

此时需要在@RequestBody后添加参数required=false,允许body为空

即可解决该问题

(2)、OPTIONS请求不应被过多的发送,因为它也是一个http请求也会占用一部分资源,相应的一种解决方法

在响应中添加缓存字段,以减少OPTIONS请求

(1)、在Java web工程中加如下列过滤器即可

(2)、在nginx中配置

使用反向代理工具解决跨域问题:如 Nginx 、 node.js

以Nginx为例:

在Nginx的配置文件中加入:

启动Nginx再以

地址访问页面

访问后台接口

发现可正常请求

上述以

地址访问页面

访问后台接口

的方式遵循了,浏览器的同源策略自然不存在跨域

Nginx代理了页面请求和接口请求,所以页面请求和接口请求都在Nginx源内由Nginx去完成页面请求和接口的请求即: 内

所以浏览器访问页面和接口都是以 来进行访问的,满足了同源策略自然不存在跨域之说

图解:

跨域:

Nginx代理,满足同源策略

Nginx反向代理其实是一种欺骗浏览器的方法

[1] 浏览器同源政策及其规避方法

[2] XMLHttpRequest Level 2 使用指南

[3] 跨域资源共享 CORS 详解

[4] HTTP访问控制(CORS)

java中怎样设置tomcat中conf/context.xml文件解决跨域每次sessionid不一样问题

在tomcat.6.0.27以上版本,跨域问题有简单解决方法:

在tomcat 的conf 目录下面 编辑:context.xml

将里面的Context修改为以下即可:

ContextsessionCookiePath=""sessionCookieDomain=".×××.cn"/

问题得到解决

之前的tomcat6跨域解决方法是自己创建jar包。

后端解决前端跨域请求问题

场景:前后端分离,页面和后端项目部署在不同服务器,出现请求跨域问题。

原因:CORS:跨来源资源共享(CORS)是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,是 JSONP 模式的现代版。与 JSONP 不同,CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求。用 CORS 可以让网页设计师用一般的 XMLHttpRequest,这种方式的错误处理比JSONP要来的好,JSONP对于 RESTful 的 API 来说,发送 POST/PUT/DELET 请求将成为问题,不利于接口的统一。但另一方面,JSONP 可以在不支持 CORS 的老旧浏览器上运作。不过现代的浏览器(IE10以上)基本都支持 CORS。

预检请求(option):在 CORS 中,可以使用 OPTIONS 方法发起一个预检请求(一般都是浏览检测到请求跨域时,会自动发起),以检测实际请求是否可以被服务器所接受。预检请求报文中的 Access-Control-Request-Method 首部字段告知服务器实际请求所使用的 HTTP 方法;Access-Control-Request-Headers 首部字段告知服务器实际请求所携带的自定义首部字段。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求。

解决方案:

1、创建一个过滤器,过滤options请求。

package com.biz.eisp.sci.util;

import org.apache.commons.httpclient.HttpStatus;

import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/**

* 解决跨域问题

*/

public class CorsFilterimplements Filter {//filter 接口的自定义实现

    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;

        response.setHeader("Access-Control-Allow-Origin", "*");

        if ("OPTIONS".equals(request.getMethod())){//这里通过判断请求的方法,判断此次是否是预检请求,如果是,立即返回一个204状态吗,标示,允许跨域;预检后,正式请求,这个方法参数就是我们设置的post了

            response.setStatus(HttpStatus.SC_NO_CONTENT); //HttpStatus.SC_NO_CONTENT = 204

            response.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, OPTIONS, DELETE");//当判定为预检请求后,设定允许请求的方法

            response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with"); //当判定为预检请求后,设定允许请求的头部类型

            response.addHeader("Access-Control-Max-Age", "1");  // 预检有效保持时间

        }

filterChain.doFilter(request, response);

    }

@Override

    public void destroy() {

}

}

2、修改web.xml文件

filter

 filter-namecors/filter-name

  filter-classcom.biz.eisp.sci.util.CorsFilter/filter-class

/filter

filter-mapping

filter-namecors/filter-name

  url-pattern/* /url-pattern

/filter-mapping

3、spring-mvc.xml添加HttpRequestHandlerAdapter http请求处理器适配器。

HttpRequestHandlerAdapter作为HTTP请求处理器适配器仅仅支持对HTTP请求处理器的适配。它简单的将HTTP请求对象和响应对象传递给HTTP请求处理器的实现,它并不需要返回值。它主要应用在基于HTTP的远程调用的实现上。

bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/

java跨域问题怎么解决的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java跨域访问四种方式、java跨域问题怎么解决的信息别忘了在本站进行查找喔。