cors解决Web跨域访问问题

首先了解一下什么是跨域以及解决的几种常见方式。

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。

所谓同源是指,域名,协议,端口均相同。

举例:

相对于http://store.company.com/dir/page.html

常见的解决跨域访问的方法:

1.JSONP
2.window.name + iframe
3.hash + iframe
4.postMessage
5.CORS
6.WebSockets

概念科普:

CORS是W3c工作草案,它定义了在跨域访问资源时浏览器和服务器之间如何通信。CORS背后的基本思想是使用自定义的HTTP头部允许浏览器和服务器相互了解对方,从而决定请求或响应成功与否。
同源策略:是浏览器最核心也最基本的安全功能;同源指的是:同协议,同域名和同端口。精髓:认为自任何站点装载的信赖内容是不安全的。当被浏览器半信半疑的脚本运行在沙箱时,它们应该只被允许访问来自同一站点的资源,而不是那些来自其它站点可能怀有恶意的资源;参考:JavaScript 的同源策略
JSON & JSONP:JSON 是一种基于文本的数据交换方式,或者叫做数据描述格式。JSONP是资料格式JSON的一种“使用模式”,可以让网页从别的网域要资料,由于同源策略,一般来说位于server1.example.com的网页无法与不是 server1.example.com的服务器沟通,而HTML的script元素是一个例外。利用script元素的这个开放策略,网页可以得到从其他来源动态产生的JSON资料,而这种使用模式就是所谓的JSONP

其中最常用的应该是前台用JSONP,或者后台用CORS,这里我用的是在JavaWeb项目中用CORS解决。

什么是CORS:

Cross-Origin Resource Sharing(CORS)跨来源资源共享是一份浏览器技术的规范,提供了 Web 服务从不同域传来沙盒脚本的方法,以避开浏览器的同源策略,是 JSONP 模式的现代版。与 JSONP 不同,CORS 除了 GET 要求方法以外也支持其他的 HTTP 要求。用 CORS 可以让网页设计师用一般的 XMLHttpRequest,这种方式的错误处理比 JSONP 要来的好。另一方面,JSONP 可以在不支持 CORS 的老旧浏览器上运作。现代的浏览器都支持 CORS。

使用的例子:

配置过滤器:

package com.wazn.learn.util;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;

public class SimpleCORSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("SimpleCORSFilter启动!!!===========");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse)response;
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        res.setHeader("Access-Control-Max-Age", "3600");
        res.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("SimpleCORSFilter结束!!!===========");
    }

}

配置web.xml文件:

      <!-- cors解决跨域访问问题 -->
    <filter>
        <filter-name>cors</filter-name>
        <filter-class>com.wazn.learn.util.SimpleCORSFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cors</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

调用的方法:

    @RequestMapping("select")
    @ResponseBody
    public JSONObject select(int page , int limit , String title){
        JSONObject jo = new JSONObject();
        Map<String,Object> map = newsService.select(page,limit,title);
        jo.put("code",0);
        jo.put("msg", true);
        jo.put("data", map.get("data"));
        jo.put("count", map.get("count"));
        return jo;
    }

端口为80,也就是默认不输入直接访问

前台测试方法:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="js/jquery-1.12.4.min.js"></script>
    </head>
    <body>
        <h1>ajax测试接口</h1>
    </body>
    <script type="text/javascript">
        $(function() {
            $.ajax({
                type:"post",
                url:"http://192.168.1.113/basepro/knowledge/news/select",
                data:{
                    page:1,
                    limit:1000
                },
                dataType:"json",//返回的
                success:function(data) {
                    alert(data.msg);
                },
                error:function(msg) {
                    console.log(msg);
                }
            });
        });
    </script>
</html>

测试成功!

原文地址:https://www.cnblogs.com/jiangwz/p/8142740.html

时间: 2024-10-24 18:00:31

cors解决Web跨域访问问题的相关文章

基于CORS的GeoServer跨域访问策略

GeoServer的跨域访问问题,有多种解决方法,本文介绍一种基于CORS的GeoServer跨域访问方法. CORS简介 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制,它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制.通常由于同域

使用微软CORS包不能跨域访问的问题

使用jquery的ajax异步调用的时候会出现不能跨域访问的问题,这个问题一般有两种方法. 1:使用jsonp跨域 2:使用html5的CORS 在这里只谈论第二种,微软对CORS提供的了支持,在NuGet安装Microsoft.AspNet.WebApi.Cors就可以使用跨域的功能. 但是事实并不是这样,在有的时候使用了这个DLL然后添加跨域的方法依然没有效果. 那我们可以使用其他的方法解决这类问题. 最简单的就是修改Web.config文件 在system.webServer节点下复制如下

解决cookie跨域访问

一.前言 随着项目模块越来越多,很多模块现在都是独立部署.模块之间的交流有时可能会通过cookie来完成.比如说门户和应用,分别部署在不同的机器或者web容器中,假如用户登陆之后会在浏览器客户端写入cookie(记录着用户上下文信息),应用想要获取门户下的cookie,这就产生了cookie跨域的问题. 二.介绍一下cookie cookie 路径: cookie 一般都是由于用户访问页面而被创建的,可是并不是只有在创建 cookie 的页面才可以访问这个cookie.在默认情况下,出于安全方面

cors解决ajax跨域

此方法只支持spring4.2及以上版本 一.问题描述 A系统和B系统,A系统想通过ajax调用B系统中的后台方法(B系统SpringMVC) 二.问题解决 1.A系统中ajax: var str = "{'id':'89','fundCode':'000311'}"; jQuery.ajax({ url:'http://172.88.88.888:8180/test/app/product/public/getManaAndComp', type:"post",

使用JSONP彻底解决Ajax跨域访问Cookie Session的方案

最近做开发时要把图片文件放到另外一台服务器上(另外一个域名),因为这样分布式存放,网站打开速度会快很多.而我采用AJAX获取图片服务器上某用户的图片时遇到了问题,按照通常的方式无法获取信息,得到的Cookie都是null,后来想到浏览器出于安全考虑JavaScript和iframe不能跨域访问,那我们就要考虑使用其他途径来完成了,捣鼓了2天终于找到了解决方案,我使用JSONP来解决,请看. JS代码: $.ajax({ type: "get", url: "http://ww

解决Js跨域访问的问题

用Js获取Html标签<input type="file"/>的路径!遇到代码拒绝访问,提示安全验证,不允许跨域访问,简单的设置一下浏览器即可,不过对于不知道的朋友们遇到这种情况也是够发愁的.

CORS解决WebApi跨域问题(转)

CORS全称Cross-Origin Resource Sharing,中文全称跨域资源共享.它解决跨域问题的原理是通过向http的请求报文和响应报文里面加入相应的标识告诉浏览器它能访问哪些域名的请求 在WebApiCORS项目上面使用Nuget搜索"microsoft.aspnet.webapi.cors" 然后在App_Start文件夹下面的WebApiConfig.cs文件夹配置跨域 public static class WebApiConfig { public static

express解决ajax跨域访问session失效问题

最近在学习express,就用以前做的项目来进行express前后端分离的练手了,在做登陆注册的时候发现跨域的时候,session的值是会失效的,导致session里面的数据获取为undefined,网上找资料加上自己的不断尝试,终于找到了解决方法,简单记录一下解决方法. 1.客户端因为session原则上是需要cookie支持的,所以Ajax方法里面必须添加 xhrFields:{withCredentials:true},表示允许带Cookie的跨域Ajax请求( 特别说明,只要使用的ses

让webapi支持CORS,可以跨域访问

1.在NuGet里搜索webapi找到下面的扩展,添加进项目里. 2.在Global.asax中添加一行代码 protected void Application_Start() { //添加CORS的支持 GlobalConfiguration.Configuration.EnableCors(); //其他东西 AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuratio