当前位置: 首页 > news >正文

做优秀网站一站式媒体发布平台

做优秀网站,一站式媒体发布平台,微博内网站怎么做的,玩具网站建设策划书流程文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理:添加以下http响应头2.3. 四种跨域实现方式及优先级(从高到低) 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…

文章目录

  • 1. 前置知识
  • 2. 原理和解决方案总结
    • 2.1. 跨域不通过原理流程图
    • 2.2. 实现原理:添加以下http响应头
    • 2.3. 四种跨域实现方式及优先级(从高到低)
  • 3. 具体实现代码
    • 3.1. 跨域全局配置方式-Filter(全适用)
    • 3.2. 跨域全局配置方式-SpringMvc
    • 3.3. 跨域单个配置方式-WebServlet
    • 3.4. 跨域单个配置方式-SpringMvc
  • 4.非java实现方式
    • 4.1. nginx代理
  • 9. 参考文章

1. 前置知识

  1. 【尚硅谷】【视频】【B站】禹神:一小时彻底搞懂跨域&解决方案
  2. 【尚硅谷】【笔记】【CSDN】禹神:彻底搞懂前端跨域&解决方案

2. 原理和解决方案总结

2.1. 跨域不通过原理流程图

跨域不通过原理流程图

2.2. 实现原理:添加以下http响应头

序号响应头含义
1Access-Control-Allow-Origin允许的源
2Access-Control-Allow-Methods允许的方法
3Access-Control-Allow-Headers允许的自定义头
4Access-Control-Max-Age预检请求的结果缓存时间(可选)

跨域解决方案原理

2.3. 四种跨域实现方式及优先级(从高到低)

  1. 跨域全局配置方式-Filter(全适用): 重写 Filter.doFilter(),设置 res.setHeader(“Access-Control-Allow-Origin”, “*”) 等响应头参数
  2. 跨域全局配置方式-SpringMvc : 重写 WebMvcConfigurer.addCorsMappings(),设置 registry.addMapping(“/**”).allowedOrigins(“*”)等响应头参数(只对SpringMvc写法生效,对原生Servlet不生效)
  3. 跨域单个配置方式-WebServlet: 设置 res.addHeader(“Access-Control-Allow-Origin”, “*”) 等响应头参数
  4. 跨域单个配置方式-SpringMvc : 添加 @CrossOrigin注解,设置origins等响应头参数(只对SpringMvc写法生效,对原生Servlet不生效)

3. 具体实现代码

  • gitee源码

3.1. 跨域全局配置方式-Filter(全适用)

  • 重写Filter.doFilter(),设置 res.setHeader("Access-Control-Allow-Origin", "*") 等响应头参数
/** 1.跨域全局配置方式-Filter(全适用) */
@Configuration
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletResponse res = (HttpServletResponse) response;res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));                                  //【跨域配置】[必需]               允许请求源  :默认值 无,配置"*"允许所有。// 如果是复杂请求的预检请求(判断逻辑同SpringMvc),设置以下响应头,且没必要执行其它过滤器链 chain.doFilter(request, response);if (req.getMethod().equalsIgnoreCase("OPTIONS") && !ObjUtil.hasNull(req.getHeader("Origin"), req.getHeader("Access-Control-Request-Method"))) {res.setHeader("Access-Control-Allow-Methods", req.getHeader("Access-Control-Request-Method"));      //【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值 无,配置 "*",允许所有res.setHeader("Access-Control-Allow-Headers", req.getHeader("Access-Control-Request-Headers"));     //【跨域配置】[有复杂请求头时必需]    允许请求头 : 默认值 无,配置 "*",允许所有res.setHeader("Access-Control-Max-Age", "5");                                                       //【跨域配置】[非必需]             预检缓存时长: 默认值 依赖客户端。EDGE浏览器默认值为3秒。【注意浏览器不要禁用缓存,否则不生效】return;}}
}

3.2. 跨域全局配置方式-SpringMvc

  • 重写 WebMvcConfigurer.addCorsMappings(),设置 registry.addMapping(“/**”).allowedOrigins(“*”)等响应头参数(只对SpringMvc写法生效,对原生Servlet不生效)
/** 2.跨域全局配置方式-SpringMvc */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")      // 适配@RequestMapping。 (例如:/ajax/** 开头的)// 下面几个参数,不配置,会使用默认值。origins 和 originPatterns取并集.allowedOrigins("*")                    //【跨域配置】[必需]               允许请求源:默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", ).allowedOriginPatterns("*")             //【跨域配置】[必需]               允许请求源:默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", ).allowedMethods("*")                    //【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值为GET,POST,HEAD。相当于res.setHeader("Access-Control-Allow-Methods", ).allowedHeaders("*")                    //【跨域配置】[有复杂请求头时必需]    允许请求头 :默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Headers", ).maxAge(1800);                          //【跨域配置】[非必需]             预检缓存时长:默认值 1800秒。小于等于0时缓存无效【注意浏览器不要禁用缓存,否则不生效】。相当于res.setHeader("Access-Control-Max-Age", )}
}

3.3. 跨域单个配置方式-WebServlet

  • 设置 res.addHeader(“Access-Control-Allow-Origin”, “*”) 等响应头参数

/** 3.跨域单个配置方式-WebServlet */
@Slf4j
@WebServlet(name = "ajax", value = {"/ajax/WebServlet", "/ajax/WebServlet/"})
public class AjaxWebServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws IOException {log.warn("method==【{}】, name==【{}】, header.origin==【{}】, Access-Control-Request-Method==【{}】, Access-Control-Request-Headers==【{}】", req.getMethod(), req.getParameter("name"), req.getHeader("Origin"), req.getHeader("Access-Control-Request-Method"), req.getHeader("Access-Control-Request-Headers"));res.setHeader("Access-Control-Allow-Origin", "*");      //【跨域配置】[必需]               允许请求源  :默认值 无,配置"*"允许所有。res.setHeader("Access-Control-Allow-Methods", "*");     //【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值 无,配置 "*",允许所有res.setHeader("Access-Control-Allow-Headers", "*");     //【跨域配置】[有复杂请求头时必需]    允许请求头 : 默认值 无,配置 "*",允许所有res.setHeader("Access-Control-Max-Age", "1800");        //【跨域配置】[非必需]             预检缓存时长: 默认值 依赖客户端。EDGE浏览器默认值为3秒。【注意浏览器不要禁用缓存,否则不生效】res.getWriter().write(DateUtil.now() + "@" + req.getMethod());}
}

3.4. 跨域单个配置方式-SpringMvc

  • 添加 @CrossOrigin注解,设置origins等响应头参数(只对SpringMvc写法生效,对原生Servlet不生效)
/* 4.跨域单个配置方式-SpringMvc */
@Slf4j
@RestController
@RequestMapping("/ajax")
public class AjaxController {@CrossOrigin(// origins 和 originPatterns取并集。【注意】此处配置与下面的res.setHeader()功能相同,优先级较低。二选其一即可origins = {"*"},            //【跨域配置】[必需]               允许请求源  :默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", )originPatterns = {"*"},     //【跨域配置】[必需]               允许请求源  :默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Origin", )methods = {},               //【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值为(优先以@RequestMapping的method属性为准,如果没有指定则默认为"GET,POST,HEAD)。相当于res.setHeader("Access-Control-Allow-Methods", )allowedHeaders = {"*"},     //【跨域配置】[有复杂请求头时必需]    允许请求头 :默认值为"*",即允许所有。相当于res.setHeader("Access-Control-Allow-Headers", )maxAge = 1800               //【跨域配置】[非必需]             预检缓存时长:默认值 1800秒。小于等于0时缓存无效【注意浏览器不要禁用缓存,否则不生效】 。相当于res.setHeader("Access-Control-Max-Age", ))@RequestMapping(value = "/CrossOrigin", method = {RequestMethod.GET, RequestMethod.PUT})@SneakyThrowsvoid ajax(HttpServletRequest req, HttpServletResponse res) {log.warn("method==【{}】, name==【{}】, header.origin==【{}】, Access-Control-Request-Method==【{}】, Access-Control-Request-Headers==【{}】", req.getMethod(), req.getParameter("name"), req.getHeader("Origin"), req.getHeader("Access-Control-Request-Method"), req.getHeader("Access-Control-Request-Headers"));res.getWriter().write(DateUtil.now() + "@" + req.getMethod());}
}

4.非java实现方式

4.1. nginx代理

  • 优点:不用侵入java代码
  1. 配置nginx反向代理。在配置文件nginx.confhttp中添加一个server
  2. AJAX请求通过nginx转发。本例中,将AJAX请求发给58080端口,然后转发给8080端口
server {listen      58080;server_name localhost;location / {proxy_pass http://localhost:8080;# 增加响应头add_header       Access-Control-Allow-Origin  "*";          # 【跨域配置】[必需]               允许请求源  :默认值 无,配置"*"允许所有。if ($request_method = 'OPTIONS') {          # 如果是复杂请求的预检请求(参考SpringMvc,最好同时判断请求头OriginAccess-Control-Request-Method都不为null,略),设置以下响应头,且没必要透传,直接返回add_header   Access-Control-Allow-Origin  "*";          # 【跨域配置】[必需]               允许请求源  :默认值 无,配置"*"允许所有。add_header   Access-Control-Allow-Methods "*";          # 【跨域配置】[有复杂请求方法时必需]  允许请求方法:默认值 无,配置 "*",允许所有add_header   Access-Control-Allow-Headers "*";          # 【跨域配置】[有复杂请求头时必需]    允许请求头 : 默认值 无,配置 "*",允许所有add_header   Access-Control-Max-Age "5";                # 【跨域配置】[非必需]             预检缓存时长: 默认值 依赖客户端。EDGE浏览器默认值为3秒。【注意浏览器不要禁用缓存,否则不生效】return 204;}}
}

9. 参考文章

  • @CrossOrigin详细参数说明
  • SpringBoot处理跨域请求的四种方法
http://www.hkea.cn/news/813995/

相关文章:

  • 南安市网站建设成都今天重大新闻事件
  • 网站后台补丁如何做软文有哪几种类型
  • 网站建设的费用包括哪些内容资讯门户类网站有哪些
  • 一站式服务图片制作网页的基本步骤
  • 个人网站建设网站网络网站推广
  • asp做的药店网站模板北京百度快照推广公司
  • 网站建设泉州效率网络seo的优化策略有哪些
  • 页网站无锡网站制作推广
  • 一流的龙岗网站建设目前最靠谱的推广平台
  • 企业营销型网站费用短视频推广引流
  • 化妆品可做的团购网站有哪些seo研究中心南宁线下
  • 网站空间域名是什么做电商必备的几个软件
  • 软件公司运营是做什么的seo公司运营
  • 专业云南做网站福州短视频seo服务
  • 网站开发技术期中试题电商培训机构排名
  • 网站设计连接数据库怎么做如何进行百度推广
  • 日本网站图片做淘宝代购网络营销促销方案
  • 网站开发导航栏网站制作的费用
  • 盐城网站设计网站流量统计工具
  • 网站上如何做相关推荐郑州建网站的公司
  • 漂亮大气的装潢室内设计网站模板 单页式html5网页模板包前端优化
  • 论坛网站开发开题报告青岛百度推广多少钱
  • 文山做网站如何优化百度seo排名
  • 上海展陈设计公司有哪些成都网站seo性价比高
  • 小韩网站源码360广告投放平台
  • 网站地图的重要性短信广告投放软件
  • 搭建直播网站需要怎么做教育培训机构平台
  • 濮阳网站网站建设网络营销策划是什么
  • 做新闻网站需要什么手续河北软文搜索引擎推广公司
  • 广州网站建设联系电话seo推广的公司