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

news2025/2/22 9:49:24

后端 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.coloradmin.cn/o/1800121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python报错】已解决Attributeerror: ‘list‘ object has no attribute ‘join‘( Solved)

解决Python报错&#xff1a;AttributeError: ‘list’ object has no attribute ‘join’ (Solved) 在Python中&#xff0c;字符串&#xff08;str&#xff09;对象有一个非常有用的join()方法&#xff0c;它允许你将序列中的元素连接&#xff08;join&#xff09;成一个字符串…

动态规划学习(混合背包,有依赖的背包,以及背包思想)

混合背包的定义&#xff1a; 混合背包问题就是混合01背包、完全背包和多重背包&#xff0c;可供选择的物体i可能有一个、或者无数个、或者有限个。 所以&#xff0c;就不要考虑这么多了&#xff0c;直接分这三种情况考虑就行&#xff01;&#xff01; 样例&#xff1a; for(…

优化财务管理制度提升企业经营效益—以审计代理记账为例

随着社会经济的快速发展&#xff0c;企业经营规模不断扩大&#xff0c;面临的财务管理问题也日益复杂&#xff0c;而作为其中的重要一环&#xff0c;审计代理记账已经成为了企业的必要组成部分&#xff0c;本文将重点探讨审计代理记账对于优化企业财务管理&#xff0c;提高经营…

【数据结构】图论入门

引入 数据的逻辑结构&#xff1a; 集合&#xff1a;数据元素间除“同属于一个集合”外&#xff0c;无其他关系线性结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;线性表、栈、队列树形结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;树图形结构&#xff1…

Linux 中常用的设置、工具和操作

1.设置固定的ip地址步骤 1.1 添加IPADDR“所设置的固定ip地址” TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"static" DEFROUTE"yes" IPV4_FAILURE_FATAL"no" IPV6INIT"yes" IPV6…

Vue——模板引用(不建议使用,了解)

文章目录 前言测试案例 前言 模板引用&#xff0c;在官方文档中也有很详细的描述。 虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作&#xff0c;但在某些情况下&#xff0c;我们仍然需要直接访问底层 DOM 元素。 个人理解为&#xff1a; 在vue中&#xff0c;依据…

gcc与g++的原理

程序的翻译 1 快速认识gcc/g2 程序翻译的过程2.1 预处理阶段2.2 编译阶段2.3 汇编阶段2.4 链接阶段 3 动静态库 1 快速认识gcc/g 首先我们需要在linux系统中安装对应的编译器gcc/g&#xff0c;安装命令如下&#xff08;centos7环境下&#xff09;&#xff1a; gcc: yum instal…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十三)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 20 - 21节&#xff09; P20《19.ArkUI-属性动画和显式动画》 本节先来学习属性动画和显式动画&#xff1a; 在代码中定义动画&am…

Qt开发技术:Q3D图表开发笔记(四):Q3DSurface三维曲面图颜色样式详解、Demo以及代码详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139424086 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子网络科技博…

centos安装vscode的教程

centos安装vscode的教程 步骤一&#xff1a;打开vscode官网找到历史版本 历史版本链接 步骤二&#xff1a;找到文件下载的位置 在命令行中输入&#xff08;稍等片刻即可打开&#xff09;&#xff1a; /usr/share/code/bin/code关闭vscode后&#xff0c;可在应用程序----编程…

Matplotlib常见图汇总

Matplotlib是python的一个画图库&#xff0c;便于数据可视化。 安装命令 pip install matplotlib 常用命令&#xff1a; 绘制直线&#xff0c;连接两个点 import matplotlib.pyplot as plt plt.plot([0,5],[2,4]) plt.show() 运行结果如下&#xff1a; 多条线&#xff1a;…

计算机组成实验---Cache的实现

直接映射 先看懂cache的映射原理&#xff0c;根据cache大小与主存大小来计算各个信号线的位数 各个信号线位数 主存地址在逻辑上分为区号、块号、块内地址 Cache结构 Cache访问原理 基本过程 状态机&#xff1a;“三段式”实现 6.3 Verilog 状态机 | 菜鸟教程 (runoob.com) …

Proxyman 现代直观的 HTTP 调试代理应用程序

Proxyman 是一款现代而直观的 HTTP 调试代理应用程序&#xff0c;它的功能强大&#xff0c;使您可以轻松捕获、检查和操作 HTTP(s) 流量。不再让繁杂的网络调试工具阻碍您的工作&#xff0c;使用 Proxyman&#xff0c;您将轻松应对网络调试的挑战。 下载地址&#xff1a;https…

el-table 固定前n行

el-table 固定前n行 第一种&#xff0c;通过设置前几行粘性布局 <el-table:data"tableData2"borderheight"calc(98% - 40px)"// 设置行样式:row-class-name"TableRowClassName"selection-change"handleSelectionChange" ><…

计网期末复习指南(四):网络层(IP协议、IPv4、IPv6、CIDR、ARP、ICMP)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算…

Java 初识

Java 的发展历程 Sun 公司。 Oracle 公司。 普通版本&#xff0c;也叫过渡版本。 正式版本&#xff0c;也叫长期支持版本&#xff08;LTS&#xff09;。 Java SE&#xff0c;Java EE&#xff0c;Java ME Java 技术体系分为三个平台&#xff1a;Java SE&#xff0c;Java EE&a…

【全开源】Fastflow工作流系统(FastAdmin+ThinkPHP)

&#x1f680;Fastflow工作流系统&#xff1a;高效协作&#xff0c;流程无忧​ 一款基于FastAdminThinkPHP开发的可视化工作流程审批插件&#xff0c;帮助用户基于企业业务模式和管理模式自行定义所需的各种流程应用&#xff0c;快速构建企业自身的流程管控体系&#xff0c;快…

Windows mstsc

windows mstsc 局域网远程计算机192.168.0.113为例&#xff0c;远程控制命令mstsc

【mysql】数据报错: incorrect datetime value ‘0000-00-00 00:00:00‘ for column

一、问题原因 时间字段在导入值0000-00-00 00:00:00或者添加 NOT NULL的时间字段时&#xff0c;会往mysql添加0值&#xff0c;此时可能出现此报错。 这是因为当前的MySQL不支持datetime为0&#xff0c;在MySQL5.7版本以上&#xff0c;默认设置sql_mode模式包含NO_ZERO_DATE, N…

SQL Server数据库xp_cmdshell提权笔记

文章目录 一、简介二、搭建环境三、利用条件1、查询 xp_cmdshell 是否开启&#xff0c;返回为1则证明存在2、判断权限是不是sa&#xff0c;回是1说明是sa3、开启xp_cmdshell4、关闭xp_cmdshell 四、获取数据库权限1、成功获取sqlserver&#xff0c;进行登陆2、开启xp_cmdshell权…