• Ajax:ajax跨域解决方案代理机制原理及实现



    目录:

    (1)ajax跨域解决方案之代理机制实现原理

    (2)ajax跨域解决方案之代理机制的代码实现


     

    (1)ajax跨域解决方案之代理机制实现原理

    ajax请求访问servlet,可以让ajax请求跨域,通过直接本应用中的资源servlet,ajax可以不跨域访问本应用中的servlet,让java程序发送Get,Post请求,来访问2号服务器中的的servlet

     

    用java代码模拟浏览器的行为,就好比在浏览器地址栏输入地址敲回车一样

    首先把架包导入:创建lib目录,复制进去  选中右键Add as library

    HttpClientSendGet:

    1. package com.bjpowernode.httpclient;
    2. import org.apache.http.HttpEntity;
    3. import org.apache.http.HttpResponse;
    4. import org.apache.http.client.methods.HttpGet;
    5. import org.apache.http.client.methods.HttpPost;
    6. import org.apache.http.impl.client.CloseableHttpClient;
    7. import org.apache.http.impl.client.HttpClients;
    8. import java.io.BufferedReader;
    9. import java.io.InputStreamReader;
    10. public class HttpClientSendGet {
    11. public static void main(String[] args) throws Exception {
    12. // 使用java代码去发送HTTP get请求
    13. // 目标地址
    14. //String url = "https://www.baidu.com";
    15. String url = "http://localhost:8081/b/hello";
    16. HttpGet httpGet = new HttpGet(url);
    17. // 设置类型 "application/x-www-form-urlencoded" "application/json"
    18. httpGet.setHeader("Content-Type", "application/x-www-form-urlencoded");
    19. //System.out.println("调用URL: " + httpGet.getURI());
    20. // httpClient实例化
    21. CloseableHttpClient httpClient = HttpClients.createDefault();
    22. // 执行请求并获取返回
    23. HttpResponse response = httpClient.execute(httpGet);
    24. HttpEntity entity = response.getEntity();
    25. //System.out.println("返回状态码:" + response.getStatusLine());
    26. // 显示结果
    27. BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
    28. String line = null;
    29. StringBuffer responseSB = new StringBuffer();
    30. while ((line = reader.readLine()) != null) {
    31. responseSB.append(line);
    32. }
    33. System.out.println("服务器响应的数据:" + responseSB);
    34. reader.close();
    35. httpClient.close();
    36. }
    37. }

     运行:

     (2)ajax跨域解决方案之代理机制的代码实现

    b站点创建Servlet

    TargetServlet:

    1. package com.bjpowernode.b.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/target")
    9. public class TargetServlet extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    12. throws ServletException, IOException {
    13. // 响应一个json字符串。
    14. response.getWriter().print("{\"username\":\"jackson\"}");
    15. }
    16. }

     a站点需要servlet,首先需要加入servlet依赖:

    引入架包:httpclient架包

     

     

     

    ProxyServlet:发送get请求,访问b站点TargerServlet,请求响应回来数据在进行响应

     

    1. package com.bjpowernode.javaweb.servlet;
    2. import org.apache.http.HttpEntity;
    3. import org.apache.http.HttpResponse;
    4. import org.apache.http.client.methods.HttpGet;
    5. import org.apache.http.impl.client.CloseableHttpClient;
    6. import org.apache.http.impl.client.HttpClients;
    7. import javax.servlet.ServletException;
    8. import javax.servlet.annotation.WebServlet;
    9. import javax.servlet.http.HttpServlet;
    10. import javax.servlet.http.HttpServletRequest;
    11. import javax.servlet.http.HttpServletResponse;
    12. import java.io.BufferedReader;
    13. import java.io.IOException;
    14. import java.io.InputStreamReader;
    15. @WebServlet("/proxy")
    16. public class ProxyServlet extends HttpServlet {
    17. @Override
    18. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    19. throws ServletException, IOException {
    20. // 通过httpclient组件,发送HTTP GET请求,访问 TargetServlet
    21. HttpGet httpGet = new HttpGet("http://localhost:8081/b/target");
    22. httpGet.setHeader("Content-Type", "application/x-www-form-urlencoded");
    23. CloseableHttpClient httpClient = HttpClients.createDefault();
    24. HttpResponse resp = httpClient.execute(httpGet);
    25. HttpEntity entity = resp.getEntity();
    26. BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
    27. String line = null;
    28. StringBuffer responseSB = new StringBuffer();
    29. while ((line = reader.readLine()) != null) {
    30. responseSB.append(line);
    31. }
    32. reader.close();
    33. httpClient.close();
    34. // b站点响应回来的数据
    35. response.getWriter().print(responseSB);
    36. }
    37. }

    ajax5.html:发送ajax请求:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>使用代理机制完成ajax跨域访问title>
    6. head>
    7. <body>
    8. <script type="text/javascript">
    9. // ES6当中的有一个新语法:箭头函数。
    10. window.onload = () => {
    11. document.getElementById("btn").onclick = () => {
    12. // 发送ajax请求
    13. // 1.创建核心对象
    14. const xmlHttpRequest = new XMLHttpRequest(); // const可以声明变量。(可以自己研究一下:var let const声明变量时有什么区别)
    15. // 2.注册回调函数
    16. xmlHttpRequest.onreadystatechange = () => {
    17. if (xmlHttpRequest.readyState == 4) {
    18. // 这里也可以使用区间的方式,因为状态码是200~299都是正常响应结束。
    19. if (xmlHttpRequest.status >= 200 && xmlHttpRequest.status < 300) {
    20. document.getElementById("mydiv").innerHTML = xmlHttpRequest.responseText
    21. }
    22. }
    23. }
    24. // 3.开启通道
    25. xmlHttpRequest.open("GET", "/a/proxy", true)
    26. // 4.发送请求
    27. xmlHttpRequest.send()
    28. }
    29. }
    30. script>
    31. <button id="btn">使用代理机制解决ajax跨域访问button>
    32. <div id="mydiv">div>
    33. body>
    34. html>

    点击按钮:

     

     

     

  • 相关阅读:
    minikube基本使用方法
    vue 中 style 里面使用 scoped + @import 引入 css 后 scoped 属性不生效导致全局作用域
    双通道音频功率放大电路,外接元件少, 通道分离性好,3V 的低压下可正常使用——D2025
    Java中的异常处理机制
    北斗导航 | 接收机完好性监测合集(附代码链接)
    C语言函数概述——拜佛代码
    Linux安装Jenkins
    数据结构学习笔记 - 分块和莫队
    测试集为什么不能当做验证集使用?
    Flutter 3.3 现已发布
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/125952352