nanohttpd:实现跨域(CORS)请求
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)请求相关推荐
- 跨域(CORS)请求问题[No 'Access-Control-Allow-Origin' header is present on the requested resource]常见解决方案
基本概念 跨域(CORS)请求:同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略, ...
- 跨域 cors 请求两次_请求两次的故事-CORS
跨域 cors 请求两次 The story of requesting twice, allow me to explain how it all began. 请求两次的故事,让我解释一下这是如何 ...
- AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)
根据视频进行整理 [https://www.bilibili.com/video/BV1WC4y1b78y?p=1] 视频资料 百度网盘: 链接:[https://pan.baidu.com/s/1n ...
- 跨域post请求实现方案小结--转
[名词解释] 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略 ...
- 面试--跨域--cors
cors是什么 cors 跨域资源共享 Cross-origin resource sharing是一种跨域的解决方案 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJA ...
- 理解同源(Same-Origin Policy)和跨域(CORS)
写在前面 本文作为我这几天阅读相关文章的一个小结. 什么是浏览器的同源策略? 同源策略是浏览器的一种为了保护用户信息安全而制订的安全策略. 为什么要有同源保护? 既然是一种安全策略,那肯定是没有它的时 ...
- 跨域 -- cors
Origin . Host . Referer 1.1 Origin -简单请求 GET HTTP/2 Origin: https://h5test.selfshero.com Referrer Po ...
- 跨域 options请求
一.什么是options请求 在正式发起跨域http请求之前,浏览器会根据需要发起一次预检(option请求),用来让服务端返回请求允许的方法(如get.post),orgin(来源|域名),以及是否 ...
- ajax中cors解决跨域,AJAX 跨域 CORS 解决方案
两种跨域方法 在 Javascript 中跨域访问是比较常见的事情 就像现在比较流行写单页应用,而单页应用在访问 API 的时候就会有跨域的问题 要解决跨域的问题,其实也并不复杂,有两种方案可以选择 ...
- iframe解决跨域ajax请求的方法
iframe跨域的基本前提是,一个页面可以嵌套非同源站点的html文件,以及某一个域名下的html页面可以通过脚本向同域名服务器发出ajax请求.当一个域名为domain1下的页面A想要向domain ...
最新文章
- CUDA Stream流并发性
- php获取某地的ip,php获取本土实际IP
- 【康复训练】[国家集训队] calc【dp】【拉格朗日插值】
- [转]Google的60款开源项目
- 4-1 可复用性概述
- ubuntu 创建桌面图标快捷方式
- 【python】列表元素统计
- V-REP笔记:导出自己的机器人模型
- Java使用多线程,UPD通过控制台之间互相通讯
- 如何把img格式转换成vmdk格式
- PHP案例 许愿墙 PHP许愿墙
- uni-app -- 改变页面背景颜色
- 支持向量机检测DGA
- NXP 公司的 RFID 卡
- 浏览器访问jsp页面
- 如何让自己的exe程序开机自启动
- 统信软件宣布旗下深度社区全新规划 打造我国主导的全球桌面系统根社区
- Java开发就业形势和面试技巧
- 【数论】同余(一):同余的基本概念与性质
- Userspace RCU原理