NanoHTTPD是一个轻量级的HTTP服务器,可以很方便地嵌入到Java程序中。所以在android平台上有广泛的使用。
NanoHTTPD默认是不支持访问跨域(CORS)请求的。如果希望自己的NanoHTTPD服务支持CORS,就要自己实现对CORS请求的响应。
关于什么是CORS,这个文档有非常详细、清晰、全面的阐述:
《HTTP访问控制(CORS)》,如果还不太清楚CORS机制的童鞋,建议先看这篇 文章补补课。

实现对跨域访问的支持的关键就是要响应跨请求,跨域请求的METHOD为OPTIONS,对收到的HTTP请求要先识别是否为跨域请求,如果是就发送正确的响应。下面是nanohttpd响应CORS请求的基本逻辑

    @Overridepublic Response serve(IHTTPSession session) {// 判断是否为跨域预请求if(isPreflightRequest(session)){// 如果是则发送CORS响应告诉浏览HTTP服务支持的METHOD及HEADERS和请求源return responseCORS(session);}// 业务逻辑...../return wrapResponse(session,responseAck(ack));}

下面是上述代码中调用的子方法的实现,
注意:因为nanohttp的headers中所有的key都是全小写,所以你会发现下面的代码,从headers获取header时,header的名字都是小写的。

 /*** 判断是否为CORS 预检请求请求(Preflight)* @param session* @return*/private static boolean isPreflightRequest(IHTTPSession session) {Map<String, String> headers = session.getHeaders();return Method.OPTIONS.equals(session.getMethod()) && headers.containsKey("origin") && headers.containsKey("access-control-request-method") && headers.containsKey("access-control-request-headers");}/*** 向响应包中添加CORS包头数据* @param session* @return*/private Response responseCORS(IHTTPSession session) {Response resp = wrapResponse(session,newFixedLengthResponse(""));Map<String, String> headers = session.getHeaders();resp.addHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS");String requestHeaders = headers.get("access-control-request-headers");String allowHeaders = MoreObjects.firstNonNull(requestHeaders, "Content-Type");resp.addHeader("Access-Control-Allow-Headers", allowHeaders);//resp.addHeader("Access-Control-Max-Age", "86400");resp.addHeader("Access-Control-Max-Age", "0");return resp;}/*** 封装响应包* @param session http请求* @param resp 响应包* @return resp*/private Response wrapResponse(IHTTPSession session,Response resp) {if(null != resp){            Map<String, String> headers = session.getHeaders();resp.addHeader("Access-Control-Allow-Credentials", "true");// 如果请求头中包含'Origin',则响应头中'Access-Control-Allow-Origin'使用此值否则为'*'// nanohttd将所有请求头的名称强制转为了小写String origin = MoreObjects.firstNonNull(headers.get("origin", "*");resp.addHeader("Access-Control-Allow-Origin", origin);String  requestHeaders = headers.get("access-control-request-headers");if(requestHeaders != null){resp.addHeader("Access-Control-Allow-Headers", requestHeaders);}}return resp;}

完整的代码参见码云仓库代码:
gu.dtalk.engine.DtalkHttpServer.java

nanohttpd:实现跨域(CORS)请求相关推荐

  1. 跨域(CORS)请求问题[No 'Access-Control-Allow-Origin' header is present on the requested resource]常见解决方案

    基本概念 跨域(CORS)请求:同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略, ...

  2. 跨域 cors 请求两次_请求两次的故事-CORS

    跨域 cors 请求两次 The story of requesting twice, allow me to explain how it all began. 请求两次的故事,让我解释一下这是如何 ...

  3. AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)

    根据视频进行整理 [https://www.bilibili.com/video/BV1WC4y1b78y?p=1] 视频资料 百度网盘: 链接:[https://pan.baidu.com/s/1n ...

  4. 跨域post请求实现方案小结--转

    [名词解释] 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略 ...

  5. 面试--跨域--cors

    cors是什么 cors 跨域资源共享 Cross-origin resource sharing是一种跨域的解决方案 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJA ...

  6. 理解同源(Same-Origin Policy)和跨域(CORS)

    写在前面 本文作为我这几天阅读相关文章的一个小结. 什么是浏览器的同源策略? 同源策略是浏览器的一种为了保护用户信息安全而制订的安全策略. 为什么要有同源保护? 既然是一种安全策略,那肯定是没有它的时 ...

  7. 跨域 -- cors

    Origin . Host . Referer 1.1 Origin -简单请求 GET HTTP/2 Origin: https://h5test.selfshero.com Referrer Po ...

  8. 跨域 options请求

    一.什么是options请求 在正式发起跨域http请求之前,浏览器会根据需要发起一次预检(option请求),用来让服务端返回请求允许的方法(如get.post),orgin(来源|域名),以及是否 ...

  9. ajax中cors解决跨域,AJAX 跨域 CORS 解决方案

    两种跨域方法 在 Javascript 中跨域访问是比较常见的事情 就像现在比较流行写单页应用,而单页应用在访问 API 的时候就会有跨域的问题 要解决跨域的问题,其实也并不复杂,有两种方案可以选择 ...

  10. iframe解决跨域ajax请求的方法

    iframe跨域的基本前提是,一个页面可以嵌套非同源站点的html文件,以及某一个域名下的html页面可以通过脚本向同域名服务器发出ajax请求.当一个域名为domain1下的页面A想要向domain ...

最新文章

  1. CUDA Stream流并发性
  2. php获取某地的ip,php获取本土实际IP
  3. 【康复训练】[国家集训队] calc【dp】【拉格朗日插值】
  4. [转]Google的60款开源项目
  5. 4-1 可复用性概述
  6. ubuntu 创建桌面图标快捷方式
  7. 【python】列表元素统计
  8. V-REP笔记:导出自己的机器人模型
  9. Java使用多线程,UPD通过控制台之间互相通讯
  10. 如何把img格式转换成vmdk格式
  11. PHP案例 许愿墙 PHP许愿墙
  12. uni-app -- 改变页面背景颜色
  13. 支持向量机检测DGA
  14. NXP 公司的 RFID 卡
  15. 浏览器访问jsp页面
  16. 如何让自己的exe程序开机自启动
  17. 统信软件宣布旗下深度社区全新规划 打造我国主导的全球桌面系统根社区
  18. Java开发就业形势和面试技巧
  19. 【数论】同余(一):同余的基本概念与性质
  20. Userspace RCU原理

热门文章

  1. 关于si4438以往犯的一些错误
  2. 处理机调度之时间片轮转调度算法实现
  3. YUV422_UYVY图像格式转RGB565
  4. duet设置_一秒把平板变 PC 电脑的扩展屏幕:TwomonUSB Duet Display 对比评测
  5. 失败产品手册:一款影音娱乐平台的败局
  6. 重复代码检查工具Simian
  7. OpManager12——一个完整的网络管理解决方案
  8. Mask-RCNN(2)Resnet101
  9. linux 摄像头yuv,camera YUV格式
  10. R语言向量自回归模型(VAR)及其实现