什么是跨域

跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。跨域的严格一点的定义是:只要 协议,域名,端口有任何一个的不同,就被当作是跨域

前段时间接触一个新的项目,原本想着做成前后端分离的,但是这样就会涉及到 ajax 跨域的问题,那时候没解决,所以就没搞前后端分离,但是今天的项目又接触到跨域(前后端分离的问题),研究了一晚上,查了很多资料,也跟一些前辈沟通过,用的方法都不同,

有人说用谷歌的插件,有人说用Nginx 做个反向代理,更有人说,用 JSONP 的方式,这这些个方法都可行,可是操作难度有点大啊,第一个先不说,要翻墙出去才能下载安装,第二个,对于很多新手来说,更是难以理解,

第三个, JSONP 只能是使用 get 方式请求数据,可是我们用 get 方式去请求数据的,这都是少数情况吧?所以,我综合了一下,希望能帮到更多的小伙伴!

这个配置允许跨域完全是在我们 后台的事,跟前端无关,我所用的后端框架是 SSM (其实也就是 Spring 的问题),其他框架的,请绕道!!!!(有接触 Nutz 框架的,这个框架的跨域更加简单,加一个注解就行了:@Filters(@By(type=CrossOriginFilter.class)))

好了,废话多了,言归正传,其实就 三部曲 就可以了,

1. 新建一个过滤器,并实现 Filter 接口

请注意导包!!!!

public class SimpleCORSFilter implements Filter {
private boolean isCross = false; @Override
public void destroy() {
isCross = false;
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (isCross) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
System.out.println("拦截请求: " + httpServletRequest.getServletPath());
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
httpServletResponse.setHeader("Access-Control-Max-Age", "0");
httpServletResponse.setHeader("Access-Control-Allow-Headers",
"Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpServletResponse.setHeader("XDomainRequestAllowed", "1");
}
chain.doFilter(request, response);
} @Override
public void init(FilterConfig filterConfig) throws ServletException {
String isCrossStr = filterConfig.getInitParameter("IsCross");
isCross = isCrossStr.equals("true") ? true : false;
System.out.println(isCrossStr);
} }

2. 在web.xml中设配置

 <!-- 跨域请求 -->
<filter>
<filter-name>SimpleCORSFilter</filter-name>
<filter-class>com.ssm.util.SimpleCORSFilter</filter-class>
<init-param>
<param-name>IsCross</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SimpleCORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3. 在 StringMVC 的配置文件中配置跨域请求

      <!-- 接口跨域配置 -->
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="*"
allowed-methods="POST, GET, OPTIONS, DELETE, PUT"
allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
allow-credentials="true" />
</mvc:cors>

Spring MVC 的跨域配置,到此结束,前端不用改任何东西,正常的使用 ajax 即可

java SSM 解决跨域问题的更多相关文章

  1. Java后台解决跨域问题

    首先说一下什么是跨域? JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.那什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制,a.com域名下的js无法操作b.c ...

  2. Java Web解决跨域请求

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

  3. java后端解决跨域

    1 package com.zys.boot_jeep.config; import org.springframework.context.annotation.Bean; import org.s ...

  4. JAVA联调接口跨域解决办法

    JAVA联调接口跨域解决办法 第一种代码: HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus. ...

  5. Java解决跨域问题

    同源 URL由协议, 域名, 端口组成. 如果两个URL的协议, 域名, 端口相同, 那么这两个URL为同源. 同源策略 script, iframe, link 可以跨域加载一些静态资源, 比如脚本 ...

  6. JAVA | Java 解决跨域问题

    JAVA | Java 解决跨域问题 Table of Contents 引言 什么是跨域(CORS) 什么情况会跨域 解决方案 前端解决方案 后端解决方案 具体方式 一.使用Filter方式进行设置 ...

  7. 基于Java服务的前后端分离解决跨域问题

    导语:解决跨域问题,前后端都增加相应的允许跨域的代码段即可. 一.后端增加允许跨域的代码,可以在具体controler层加,最好是在filter中添加,这样添加一次就够了,不用在每个controler ...

  8. java解决跨域

    方法中response.setHeader("Access-Control-Allow-Origin", "https://ding.taozugong.com" ...

  9. 使用 Nginx 部署前后端分离项目,解决跨域问题

    前后端分离这个问题其实松哥和大家聊过很多了,上周松哥把自己的两个开源项目部署在服务器上以帮助大家可以快速在线预览(喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了 ...

随机推荐

  1. Springboot 5.Springboot 返回cookies信息的post接口开发

    首先创建一个类,类里面首先登陆获取到cookie,然后带着cookie去发送请求 package com.course.server; import com.course.bean.User; imp ...

  2. Ubuntu16.04 g++5.4依旧不支持C++11问题

    jacket@jacket:~$ g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_6 ...

  3. com.android.support:appcompat-v7:27.+问题解决

    新建的项目就报下面的错误,问题指向了app/build.gradle,看起来是版本兼容的问题.     解决方案: 1.查看sdk tools的版本:26.1.1   远程依赖包是27.+,而我们的s ...

  4. Docker:容器的四种网络类型 [十三]

    一.None类型 简介:不为容器配置任何网络功能,--net=none 1.创建容器 docker run -it --network none busubox:latest 2.功能测试 [root ...

  5. django - 总结 - cookie|session

    Cookie是通过HTTP请求和响应头在客户端和服务器端传递的. 在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术. --------------------- ...

  6. ES6 数组遍历方法的实战用法总结(forEach,every,some,map,filter,reduce,reduceRight,indexOf,lastIndexOf)

    目录 forEach every some map filter reduce && reduceRight indexOf lastIndexOf 前言 ES6原生语法中提供了非常多 ...

  7. 使用 https://git.io 缩短 a GitHub.com URL.

    curl -i https://git.io -F 'url=https://develon2015.github.io' -F 'code=develon' 现在点击 http://git.io/d ...

  8. 使用Roslyn编译项目的示例

    using System; using System.Collections.Generic; using System.IO; using Microsoft.CodeAnalysis; using ...

  9. 可变与不可变类型数据,列表的copy方法

    我们先来了解一下可变与不可变类型的数据 (1)可变类型:列表,字典(内存中的数据允许被修改) 不可变类型:数字,字符串,元组(内存中的数据不允许被修改) 接着我们通过一个实例来看一看可变与不可变类型数 ...

  10. javascript基础 之 void

    1,viod是什么? javascript:void(0) 这样的代码是js中很常用的代码,void是javascript中定义的一个操作符,void后面跟一个表达式,void操作符会立即执行后面的表 ...