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

后端 java eclipse

字节流转字符

java 复制代码
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();
    }

}

前端

html 复制代码
<!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>
相关推荐
It's now1 小时前
Spring AI 基础开发流程
java·人工智能·后端·spring
cxh_陈1 小时前
线程的状态,以及和锁有什么关系
java·线程·线程的状态·线程和锁
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
R.lin1 小时前
Java 8日期时间API完全指南
java·开发语言·python
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 高校教学质量监控平台为例,包含答辩的问题和答案
java·eclipse
高山上有一只小老虎2 小时前
翻之矩阵中的行
java·算法
火钳游侠2 小时前
java单行注释,多行注释,文档注释
java·开发语言
曼巴UE52 小时前
UE FString, FName ,FText 三者转换,再次学习,官方文档理解
服务器·前端·javascript
code bean2 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
selt7912 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript