进在开发公司的文件中心组件,提供各个子系统的附件上传下载、预览、版本更新等功能,前端在今天突然给我发一张图,说预览缩略图遇到问题了,然后发了个截图给我:

这很明显是一个跨域问题,

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, <iframe>或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。

X-Frame-Options 有三个值:

  1. DENY
  2.  
  3.   表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
  4.  
  5. SAMEORIGIN
  6.  
  7.   表示该页面可以在相同域名页面的 frame 中展示(一般默认是这种)。
  8.  
  9. ALLOW-FROM uri
  10.  
  11.   表示该页面可以在指定来源的 frame 中展示。

此处很明显需要在中间件里面修改一下响应头的X-Frame-Options属性,core的中间件流程如下:

所以我们需要实现一个响应头的增删集合类:

  1. /// <summary>
  2. /// 响应头的增删集合
  3. /// </summary>
  4. public class SecurityHeadersPolicy
  5. {
  6. public IDictionary<string, string> SetHeaders { get; }
  7. = new Dictionary<string, string>();
  8.  
  9. public ISet<string> RemoveHeaders { get; }
  10. = new HashSet<string>();
  11. }

然后实现一个增删响应头的中间件:

  1. /// <summary>
  2. /// 中间件实现
  3. /// </summary>
  4. public class SecurityHeadersMiddleware
  5. {
  6. private readonly RequestDelegate _next;
  7. private readonly SecurityHeadersPolicy _policy;
  8.  
  9. public SecurityHeadersMiddleware(RequestDelegate next, SecurityHeadersPolicy policy)
  10. {
  11. _next = next;
  12. _policy = policy;
  13. }
  14.  
  15. public async Task Invoke(HttpContext context)
  16. {
  17. IHeaderDictionary headers = context.Response.Headers;
  18.  
  19. foreach (var headerValuePair in _policy.SetHeaders)
  20. {
  21. headers[headerValuePair.Key] = headerValuePair.Value;
  22. }
  23.  
  24. foreach (var header in _policy.RemoveHeaders)
  25. {
  26. headers.Remove(header);
  27. }
  28.  
  29. await _next(context);
  30. }
  31. }

提供响应头的增删方法:

  1. /// <summary>
  2. /// 响应头的增删方法
  3. /// </summary>
  4. public class SecurityHeadersBuilder
  5. {
  6. private readonly SecurityHeadersPolicy _policy = new SecurityHeadersPolicy();
  7. public SecurityHeadersBuilder AddCustomHeader(string header, string value)
  8. {
  9. _policy.SetHeaders[header] = value;
  10. return this;
  11. }
  12. public SecurityHeadersBuilder RemoveHeader(string header)
  13. {
  14. _policy.RemoveHeaders.Add(header);
  15. return this;
  16. }
  17. public SecurityHeadersPolicy Build()
  18. {
  19. return _policy;
  20. }
  21. }

然后我们需要一个中间件的拓展方法:

  1. /// <summary>
  2. /// 中间件拓展方法
  3. /// </summary>
  4. public static class UseSecurityHeaders
  5. {
  6. public static IApplicationBuilder UseSecurityHeadersMiddleware(this IApplicationBuilder app, SecurityHeadersBuilder builder)
  7. {
  8. SecurityHeadersPolicy policy = builder.Build();
  9. return app.UseMiddleware<SecurityHeadersMiddleware>(policy);
  10. }
  11. }

然后就是在startup的Configure方法中注册我们的中间件:

  1. //允许iframe嵌入资源
  2. app.UseSecurityHeadersMiddleware(new SecurityHeadersBuilder()
  3. .AddCustomHeader("X-Frame-Options", "AllowAll")
  4. );

我在这里使用的值是“AllowAll” 而不是“ALLOW-FROM uri” 是为了方便测试,如果开发的话应该是需要进行配置的,到这里再嵌入网页即可成功。

1 Refused to display ‘url’ in a frame because it set 'X-Frame-Options' to 'sameorigin' 怎么解决?的更多相关文章

  1. 14、运行Django时浏览器中遇到Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny'

    问题:Refused to display 'url' in a frame because it set 'X-Frame-Options' to 'deny' 解决办法: 只需要在 Djagno ...

  2. Refused to display '[url]' in a frame because it set 'X-Frame-Options' to 'Deny'.

    X-Frame-Options是一个HTTP标头(header),用来告诉浏览器这个网页是否可以放在iFrame内.例如: X-Frame-Options: DENY X-Frame-Options: ...

  3. linux中上传文件出现Refused to display 'http://***' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.

    刚开始出现这个问题,去百度了一下,网上很多答案都是一致的,但是在我这里没有解决问题.这个问题服务器没有打印日志.说明没有访问到服务器上,但是前端又没有问题,很奇怪,后面终于有一个同事和我说会不会是腾讯 ...

  4. odoo开发笔记 -- 跨域Refused to display in a frame because it set 'X-Frame-Options' to 'DENY'

    场景描述: odoo界面嵌入iframe,Refused to display in a frame because it set 'X-Frame-Options' to 'DENY' 跨域请求失败 ...

  5. 区别CSS中display:box;inline;none以及HTML中 <frame> 标签<table> 标签的 frame 属性

    区别display:box:display:inline:display:none三者的不同 display:block的特点是: block是Display默认的值.总是在新行上开始:该对象随后的内 ...

  6. 2.7.2 元素定位:frame 内定位 driver.switch_to.frame()

    来源: http://blog.csdn.net/anniejunyan/article/details/23257327  Selenium + Webdriver 学习(五) frame下元素定位 ...

  7. url参数中出现+、空格、=、%、&、#等字符的解决办法

    url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好?解决办法将这些字符转化成服务器可以识别的字符,对应关系如下:URL字符转义 用其它 ...

  8. Atitit.404错误解决标准流程and url汉字中文路径404错误resin4 resin chinese char path 404 err解决

    Atitit.404错误解决标准流程and 错误resin4 resin chinese char path 404 err解决 1. #原因解析 1 2. #解决方式 2 3. 输出图片流... 2 ...

  9. 如何在一个frame中调用另一个frame中的javascript函数

    1.htm <script language="javascript">function test(){alert("测试")}</scrip ...

随机推荐

  1. 个微信小程序云开发云函数

    1. project.config.json写上云函数所在目录"cloudfunctionRoot": "cloudfunctions/",如图 2. app. ...

  2. wcf 错误提示

    wcf 不弹出错误提示,只显示“服务器处理请求时遇到错误.有关构造有效服务请求的内容,请参阅服务帮助页”,添加以下节点可以弹出错误提示. <serviceDebug includeExcepti ...

  3. Mac下安装python2和python3共存

    一般是python2默认安装了,python3没有安装,这时候一般使用命令:brew install python3 进行安装 这里有个基础知识要记录一下,就是不同方法安装python的路径是不一样的 ...

  4. BitmapShader填充图形

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.*; imp ...

  5. 编译安装python3事出错:

    configure: error: no acceptable C compiler found in $PATH 问题解决 解决方法: yum intall gcc -y

  6. Java RSA分段加密

    我们通过Java进行RSA加密的时候,可能会出现如下问题: /** * 私钥加密 * * @param data 待加密数据 * @param key 密钥 * @return byte[] 加密数据 ...

  7. idea的enable auto-import/内存设置

    设置pom.xml依赖的自动导入 设置idea的memory heap On the Help menu, click Edit Custom VM Options. Set the -Xmx opt ...

  8. 【POJ - 2010】Moo University - Financial Aid(优先队列)

    Moo University - Financial Aid Descriptions 奶牛大学:奶大招生,从C头奶牛中招收N(N为奇数)头.它们分别得分score_i,需要资助学费aid_i.希望新 ...

  9. 性能优化-service进程防杀

    service作为后台服务,其重要性不言而喻,但很多时候service会被杀死,从而失去了我们原本想要其发挥的作用,在这种情况下我们该如何确保我们的service不被杀死就是本节需要讨论的内容了 se ...

  10. linux服务器常用密令

    1. 什么是linux服务器load average? Load是用来度量服务器工作量的大小,即计算机cpu任务执行队列的长度,值越大,表明包括正在运行和待运行的进程数越多.参考资料:http://e ...