java 原生http服务器 测试JS前端ajax访问实现跨域传post数据

后端 java eclipse

字节流转字符

package Httpv3;


import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;

//来源
//https://blog.csdn.net/xietansheng/article/details/78704783

//浏览器访问: http://localhost:8080/、http://localhost:8080/bb,输出: Hello World

//浏览器访问: http://localhost:8080/aa、http://localhost:8080/aa/bb,输出: Hello World AA
//                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
//原文链接:https://blog.csdn.net/xietansheng/article/details/78704783

public class Mainv2 {
	public String mydata=new String();
    public static void main(String[] args) throws Exception {
    	
    	String mydatav2= new String();
        // 创建 http 服务器, 绑定本地 8080 端口
        HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0);
        // 创上下文监听, "/" 表示匹配所有 URI 请求
        
        httpServer.createContext("/", new HttpHandler() {
            @Override
            public void handle(HttpExchange httpExchange) throws IOException {
                System.out.println("addr: " + httpExchange.getRemoteAddress() +     // 客户端IP地址
                        "; protocol: " + httpExchange.getProtocol() +               // 请求协议: HTTP/1.1
                        "; method: " + httpExchange.getRequestMethod() +            // 请求方法: GET, POST 等
                        "; URI: " + httpExchange.getRequestURI());                  // 请求 URI

                // 获取请求头
                String userAgent = httpExchange.getRequestHeaders().getFirst("User-Agent");
                System.out.println("User-Agent: " + userAgent);
                
                // 响应内容
//                byte[] respContents = "Hello World".getBytes("UTF-8");
                byte[] respContents = ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
                		+ "<note>\r\n"
                		+ "  <to>Tove</to>\r\n"
                		+ "  <from>Jani</from>\r\n"
                		+ "  <heading>Reminder</heading>\r\n"
                		+ "  <body>Don't forget me this weekend!</body>\r\n"
                		+ "</note>").getBytes("UTF-8");
                // 设置响应头
                
//                httpExchange.getResponseHeaders().add("Content-Type", "text/html; charset=UTF-8");
//               参数解释-允许跨域的各个参数
//              https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Access-Control-Request-Headers
              httpExchange.getResponseHeaders().add("Access-Control-Allow-Origin","*");
              httpExchange.getResponseHeaders().add("Access-Control-Allow-Headers","*");
              httpExchange.getResponseHeaders().add("Access-Control-Allow-Methods","*");
//              允许接收各种消息头 对应前端 xhr.setRequestHeader('Content-Type', 'application/json');
              httpExchange.getResponseHeaders().add("Access-Control-Request-Headers","*");
              httpExchange.getResponseHeaders().add("Access-Control-Expose-Headers","*" );
//              对应前端特定消息头 xhr.setRequestHeader('Content-Type', 'application/json');
              httpExchange.getResponseHeaders().add("Content-Type", "text/html; charset=UTF-8");
                
              
              // 设置响应code和内容长度
                httpExchange.sendResponseHeaders(200, respContents.length);

                // 设置响应内容
                httpExchange.getResponseBody().write(respContents);
                
//                测试数据
//                String receive = httpExchange.getResponseBody().toString();
//                System.out.println(receive);
//                
//                String receivev2 = httpExchange.getRequestBody().toString();
//                System.out.println(receivev2);
//                获取数组,把其他的body打印出来,发现是asc码
                byte[] receivev3 = httpExchange.getRequestBody().readAllBytes();
                System.out.println(Arrays.toString(receivev3));
                
//                字节流转字符流
                String utf_8 = new String(receivev3,StandardCharsets.UTF_8);
                System.out.println(utf_8);
                
                
                
                
//                String have = Arrays.toString(receivev3);
//                System.out.println(have.toString());
//                System.out.println(have);
//                System.out.println(have.length());
//                for(int i=0;i<have.length();i++) {
//                	System.out.println((char)receivev3[i]);
//                }
                
//                char[] message = new char[1000];
//                 String str = new String();
//                 String s=new String();
//                for(int i=0;i<have.length()-2;i++) {
//                	message[i]=(char)receivev3[i];
//                	System.out.println(message[i]);
//                	字符变字符串
//                	s=Character.toString(message[i]);
//                	System.out.println(s);
//                	字符串追加到 str
//                	str=str.concat(s);
//                	System.out.println(str);
//                	System.out.println(str.length());
                	
//                }
                
                
                
                
//                mydatav2.copyValueOf(message);
//                
//                System.out.println("revieve"+str);
//                System.out.println(str);
//                System.out.println(have.length());
//                
//                System.out.println("mydatav2"+mydatav2);
                
                
                
                
//                System.out.println(str.length());
//                System.out.println(Arrays.toString(receivev3));
                
                
//                InputStream have = httpExchange.getRequestBody();
//                byte[] posting = have.readAllBytes();
//                System.out.println(Arrays.toString(posting));
                
                // 关闭处理器
                httpExchange.close();
                
//              来源
//              https://vimsky.com/examples/detail/java-method-com.sun.net.httpserver.HttpExchange.getResponseHeaders.html

                
//                Headers responseHeaders = httpExchange.getResponseHeaders();
//        	    responseHeaders.add("Access-Control-Allow-Origin", "*");
//        	    responseHeaders.add("Access-Control-Allow-Headers", "*");
//        	    X-Custom-Header
//              httpExchange.getResponseHeaders().add("Content-Type", "text/html; charset=UTF-8");
//        	    httpExchange.getResponseHeaders().add("Access-Control-Allow-Methods","*");
//        	    httpExchange.sendResponseHeaders(200, respContents.length);
//        	    OutputStream outputStream = httpExchange.getResponseBody();
//        	    outputStream.write(httpExchange.getResponseCode());
//        	    outputStream.close();
                
//        	    byte[] respContentsv3 = "Hello World".getBytes("UTF-8");
//        	    httpExchange.sendResponseHeaders(200, respContentsv3.length);
//        	    httpExchange.getResponseBody().write(respContentsv3);
        	    
//        	    System.out.println("message"+httpExchange.getRequestBody().toString());
        	    
//        	    httpExchange.close();
                
            }
            
            
            
        });

        // 创建上下文监听, 处理 URI 以 "/aa" 开头的请求
        httpServer.createContext("/aa", new HttpHandler() {
            @Override
            public void handle(HttpExchange httpExchange) throws IOException {
                byte[] respContents = "Hello World AA".getBytes("UTF-8");
                
                httpExchange.getResponseHeaders().add("Content-Type", "text/html; charset=UTF-8");
                httpExchange.sendResponseHeaders(200, respContents.length);

                httpExchange.getResponseBody().write(respContents);
                httpExchange.close();
//                来源
//                https://vimsky.com/examples/detail/java-method-com.sun.net.httpserver.HttpExchange.getResponseHeaders.html
                // Add the header to avoid error:
        	    // “No 'Access-Control-Allow-Origin' header is present on the requested resource”
//                
//                Headers responseHeaders = httpExchange.getResponseHeaders();
//        	    responseHeaders.add("Access-Control-Allow-Origin", "*");
//        	    httpExchange.sendResponseHeaders(200, respContents.length);
//
//        	    OutputStream outputStream = httpExchange.getResponseBody();
//        	    outputStream.write(httpExchange.getResponseCode());
//        	    outputStream.close();
//        	    
        	    
        	    
            }
            
        });

        // 启动服务
        httpServer.start();
    }

}

前端

<!DOCTYPE html>

<!-- 来源 -->
<!-- https://cloud.tencent.com/developer/article/1705089 -->
<!-- https://geek-docs.com/ajax/ajax-questions/19_ajax_javascript_send_json_object_with_ajax.html -->
<!-- 配合java后端可以监听 -->
<!-- //原文链接:https://blog.csdn.net/xietansheng/article/details/78704783 -->


<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>Title</title>
		<script>
			function fun() {
				//发送异步请求
				//1、创建核心对象
				// var xmlhttp;
				// if (window.XMLHttpRequest) { //code for IE7+,Firefox,chrome,opera,safari
				// 	xmlhttp = new XMLHttpRequest();
				// } else { //code for IE6,IE5
				// 	xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				// }
				// //2、建立连接
				// /*
				//  * 参数:请求方式、请求的url路径、同步或异步请求(true为异步)
				//  * get方式:请求参数在url后面拼接,send方法为空;
				//  * post方式:请求参数在send方法中定义。
				//  * */
				// xmlhttp.open("GET", "ajaxServlet?username=Tim", true);
				
				// //3、发送请求
				// xmlhttp.send();
				// //4、接收及处理响应结果,当服务器响应成功了再获取
				// xmlhttp.onreadystatechange = function() { //当xmlhttp对象就绪状态改变时会触发事件
				// 	if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { //请求已完成且响应就绪,响应状态码为200
				// 		alert(xmlhttp.responseText);
				// 	}
				// };
				
				// https://geek-docs.com/ajax/ajax-questions/19_ajax_javascript_send_json_object_with_ajax.html
				
				
				// 创建XMLHttpRequest对象
				var xhr = new XMLHttpRequest();
				
				// 设置请求类型和URL
				// xhr.open('POST', 'http://example.com/api', true);
				// xhr.open('POST', 'http://localhost:8080/aa', true);
				// xhr.open('POST', '/aa', true);
				// xhr.open('POST', 'http://localhost:8080/aa', true);
				xhr.open('POST', 'http://localhost:8080', true);
				// 设置请求头
				xhr.setRequestHeader('Content-Type', 'application/json');
				
				// xhr.setRequestHeader('X-Custom-Header', 'value');
				// xhr.setRequestHeader('Access-Control-Allow-Origin','*');
				console.log("请求头已设置\n");
				// 监听服务器响应
				// xhr.onreadystatechange = function() {
				//   if (xhr.readyState === 4 && xhr.status === 200) {
				//     // 从服务器获取响应
				//     var response = JSON.parse(xhr.responseText);
				//     console.log(response);
				// 	console.log(getAllResponseHeaders());
				//   }
				// };
				
				// 构建JSON对象
				var data = {
				  name: 'John',
				  age: 25,
				  email: 'john@example.com'
				};
				
				// 将JSON对象转换为字符串
				var jsonData = JSON.stringify(data);
				
				// 发送数据
				xhr.send(jsonData);
				// 注释掉就会爆 POST 错误提示

				//4、接收及处理响应结果,当服务器响应成功了再获取
				xhr.onreadystatechange = function() { //当xmlhttp对象就绪状态改变时会触发事件
					if (xhr.readyState == 4 && xhr.status == 200) { //请求已完成且响应就绪,响应状态码为200
						alert(xhr.responseText);
						console.log("检测的正确的返回\n");
					}else{
						console.log("检测到错误的返回\n");
					}
					console.log("检测到返回函数\n");
				};
				
			}
		</script>
	</head>
	<body>
		<input type="button" value="发送异步请求" onclick="fun();">
		<input type="text">
	</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/679770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

测试工具链

缺陷管理 bug管理工具 devops---项目管理--缺陷管理 bug管理地址 https://devsecops.mychery.com:8443/chery/project?filterROLE&statusACTIVE bug管理环境 采用公司的devops平台&#xff0c;对每个项目的bug进行管理。目前在使用 接口测试和服务端性能测试 工具…

Python-3.12.0文档解读-内置函数zip()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 基本用法 示例 特性 高级用法 注意事项 版本更新 示例代码 记忆策略…

「小明赠书活动」第五期“网安三剑客”套系图书《内网渗透技术》《渗透测试技术》《Web应用安全》

大模型风潮已掀起&#xff0c;各大巨头争相入局&#xff0c;从ChatGPT到Sora&#xff0c;全球的AI应用“卷出了花”。然而&#xff0c;网络安全人员在享受AI技术带来的便捷之余&#xff0c;也不得不面对一系列新兴的安全挑战&#xff0c;无法忽视。 ⭐️ 赠书 - 图书简介 人…

攻防世界---misc---Aesop_secret

1、下载附件一张动图&#xff0c;仔细观察发现它分成了很多小块&#xff0c;观察小块但是感觉又不像是二维码&#xff0c;可能需要把图片拼起来 2、用winhex分析&#xff0c;发现有一串编码&#xff0c;看编码的开头&#xff0c;猜测是AES加密 3、解码需要密码 4、想到刚刚的图…

MySQL——C语言连接数据库

MySQL Connection ​ 连接数据库的客户端除了命令行式的还有图形化界面版本&#xff0c;网页版本&#xff0c;当然也包括语言级别的库或者是包&#xff0c;能够帮助我们直接连接数据库&#xff1b; 一、语言连接库下载 方式一&#xff1a;不建议使用&#xff0c;需要自己配置…

RabbitMQ简介

一、安装和使用方式 1.https://www.erlang.org/ https://www.rabbitmq.com/ 2.先安装Erlang&#xff0c;管理员安装&#xff0c;在安装rabbitMQ&#xff0c;也是管理员安装&#xff0c;因为rabbitMQ是用Erlang语言开发的。且每个版本的RabbitMQ对应不同的Erlang版本&…

【深度学习】【机器学习】支持向量机,网络入侵检测,KDD数据集

文章目录 环境加载数据归一化数据训练模型用测试数据集给出评估指标准确率召回率预测某个输入数据随便取一行数据加载训练好的SVM支持向量机模型并预测 全部数据和代码下载 环境 之前介绍过用深度学习做入侵检测&#xff0c;这篇用向量机。 环境Python3.10 requirements.txt…

C++候捷stl-视频笔记3

算法的形式 Cmp通常是个比大小的准则&#xff0c;是Functor。 算法所需的信息通常指迭代器如何移动 迭代器的分类 array&#xff0c;vector&#xff0c;deque它们是连续的&#xff0c;它们的迭代器是Random Access Iterator/随机访问迭代器 list的迭代器是Bidirectional Itera…

如何微调出自己的大模型——LoRA原理解析

1、前言 上一篇文章&#xff0c;我们已经讲了隐扩散模型——Stable Diffusion生成大模型。这种大模型&#xff0c;参数量及其之大。你没有足够的算力资源&#xff0c;就只能够使用人家已经训练好的大模型。既然没有办法训练属于自己的模型&#xff0c;那我们就想&#xff0c;是…

小索引大力量,记一次explain的性能优化经历

在 MySQL 的生产环境中&#xff0c;性能问题是一个常见的挑战。当数据库查询响应时间变慢&#xff0c;或者系统资源消耗异常时&#xff0c;我们需要快速定位问题并进行优化。MySQL 提供了一个强大的工具——EXPLAIN&#xff0c;它可以帮助我们分析查询语句的执行计划&#xff0…

前后端实现文件上传进度条-实时进度

后端接口代码&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 获取文件名String fileName file.getOriginalFilename();// 创建上传目标路径Path targetPa…

读书笔记-Java并发编程的艺术-第2章 Java并发机制的底层实现原理

文章目录 2.1 volatile的应用2.1.1 volatile的定义与实现原理2.1.2 volatile的使用优化 2.2 synchronized的实现原理与应用2.2.1 Java对象头2.2.2 锁的升级与对比2.2.2.1 偏向锁2.2.2.2 轻量级锁2.2.2.3 锁的优缺点对比 2.3 原子操作的实现原理2.3.1 术语定义2.3.2 处理器如何实…

Linux 内存管理 SLUB 分配器

文章目录 前言一、SLUB allocator二、SLUB core参考资料 前言 本文来自&#xff1a;https://lwn.net/Articles/229984/ [Posted April 11, 2007 by corbet]SLAB分配器是用于处理“频繁分配和释放的对象”的对象缓存内核内存分配器。它是内存管理子系统中关键的一部分&#xf…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

MySQL之查询性能优化(三)

查询性能优化 重构查询的方式 在优化有问题的查询时&#xff0c;目标应该是找到一个更优的方法获得实际需要的记过——而不是一定总是需要从MySQL获取一模一样的结果集。有时候&#xff0c;可以将查询转换一种写法让其返回一样的结果&#xff0c;但是性能更好。但也可以通过修…

关于URL获取的参数,无法执行二选一查询

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Arthas调优工具使用

1&#xff0c;服务器端下载 curl -O https://arthas.aliyun.com/arthas-boot.jar 2&#xff0c;服务器端启动 java -jar arthas-boot.jar 选定要绑定的Java进程ID 3&#xff0c;本地idea安装Arthas idea 4&#xff0c;选定方法右键trace,生成命令 trace com.xxx.xxx.xxx.vouche…

C++之noexcept

目录 1.概述 2.noexcept作为说明符 3.noexcept作为运算符 4.传统throw与noexcept比较 5.原理剖析 6.总结 1.概述 在C中&#xff0c;noexcept是一个关键字&#xff0c;用于指定函数不会抛出异常。如果函数保证不会抛出异常&#xff0c;编译器可以进行更多优化&#xff0c;…

Spring Boot既打jar包又打war包如何做

你好&#xff0c;我是柳岸花开。 引言 在软件开发中&#xff0c;根据不同的部署需求&#xff0c;我们可能需要将应用打包成不同的格式。Spring Boot作为目前流行的Java应用开发框架&#xff0c;提供了一种简单的方式来打包应用。本文将介绍如何利用Maven Profiles在Spring Boot…

JDK8安装详细教程教程-windows

&#x1f4d6;JDK8安装详细教程教程-windows ✅1. 下载✅2. 安装 ✅1. 下载 123云盘下载地址&#xff1a; JDK8 | JDK11 | JDK17 官方Oracle地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ ✅2. 安装 运行jdk-8u211-windows-x64.exe安装包文…