Javascript 函数无法发出 HTTP 请求

标签 javascript java jsp netbeans

我有两个不同的java项目,我需要它们相互交互。第一个名为 RESTfulWebServer 是一个动态 Web 项目,其中包含名为 UserServices 的 java 类中的基本 HTTP GET PUT POST 请求。它现在只在控制台(netbeans 中的输出窗口)上打印一行语句,所以没什么复杂的。

另一个名为 ClientProject 的项目也是一个动态 Web 项目,其中包含一个简单的 jsp 页面,其中包含 javascript 代码。它应该调用 RESTfulWebServer 项目并在控制台(netbeans 中的输出窗口)上打印输出行,就像 RESTfulWebServer 项目在向其发出简单 GET 请求时所做的那样。

这就是出现问题的部分。当我运行 ClientProject 时,javascript 函数被正确调用(正如我通过打印警报消息检查的那样),但它没有按预期向 RESTfulWebServer 发出 DELETE HTTP 请求。

下面附有两个代码:

RESTfulWebServer (UserServices.java)

package com.service.user;
import javax.ws.rs.*;

@Path("/user/service")
public class UserServices {
    @GET
    public void getUser()
    {
                System.out.println("Inside get user method");
    }

    @POST
    public void updateUser()
    {
        System.out.println("Inside update user method");
    }

    @DELETE
    public void deleteUser()
    {
        System.out.println("Inside DELETE user method");
    }
}

ClientProject (clientfile.jsp)

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Update User</title>
<script>
function loadResponse()
{
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function()
    {
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200)
        {
            document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
        }
    };
    xmlhttp.open("DELETE","http://localhost:8080/app/user/service",true);
    xmlhttp.send();
}
</script>
</head>
<body>
<div id="myDiv">The response text would come here</div>
<button type ="button" onclick="loadResponse()">submit</button>
</body>
</html>

客户端文件应该在控制台上打印“Inside DELETE user method”,但在“Build success”消息之后控制台上没有显示任何内容

我做错了什么?另外,我正在使用 TomCat 服务器并在 NetBeans 中执行此操作,并且我必须仅出于某种原因在此 IDE 上工作(请不要建议移动到任何其他 IDE 并检查它),如果我的代码中有任何错误或其他任何内容,请提及它?

最佳答案

首先从请求 URL 开始 http://localhost:8080/app/user/service 当它属于类级别注释时 - 有三种方法,因此选择哪一种方法,还需要提供方法级别注释以获得更好的方法。

@Path("/user/service")
public class UserServices {

  @Path("/getUser")
  @GET
  public void getUser() { System.out.println("Inside GET method"); }

  @Path("/updateUser")
  @POST
  public void updateUser() { System.out.println("Inside UPDATE method"); } 

  @Path("/deleteUser")
  @DELETE
  public void deleteUser() { System.out.println("Inside DELETE method"); }
}

现在要做一些重要的事情,这是使项目(RestWebServer)接受来自托管在单独域上的另一个项目(客户端项目/应用程序)的请求所必需的,即CORS(跨源资源共享)

CORS,简而言之,是一种安全检查,就像当应用程序从另一个域请求资源或向另一个域进行服务器调用时,这些请求会被浏览器阻止。此外,您使用的 XMLHttpRequest 强制同源策略,即请求应该从资源所在的同一域生成,因此为了使请求允许跨域访问,我们在服务器端实现 CORS 过滤器逻辑以允许执行方法(P、G、P、D)。

因此,在您的 WebService 项目中的包中添加一个这样的类,其中 UserServices 类是:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class CORSFilter implements Filter {

  public CORSFilter() { }

  public void init(FilterConfig fConfig) throws ServletException { }

  public void destroy() {   }

  public void doFilter(ServletRequest request, ServletResponse response, 
    FilterChain chain) throws IOException, ServletException {

    ((HttpServletResponse)response).addHeader("Access-Control-Allow-Origin", "*");
    ((HttpServletResponse)response).addHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
    chain.doFilter(request, response);
  }
}

现在是时候在 web.xml 中使用此过滤器

<web-app ....>

 <filter>
    <filter-name>CORSFilter</filter-name>
    <filter-class><package name -must be complete>.CORSFilter</filter-class>
 </filter>
 <filter-mapping>
    <filter-name>CORSFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

</web-app>

clientFile.jsp

现在从 View 页面调用这样的方法,仅添加方法注释

xmlhttp.open('DELETE','http://localhost:8080/app/user/service/deleteUser',true);

最后,您必须创建两个要部署的 Tomcat 服务器实例,分别将它们命名为 Service 和 Client Server,以方便创建它们。让服务拥有所有默认配置,但您必须更改客户端服务器的所有三个端口号以避免绑定(bind)错误。为此,只需双击服务器(客户端)即可查看端口标题并更改端口。

一切都完成了,它现在应该可以运行并经过测试。希望这对您和其他线程读者也有帮助。

关于Javascript 函数无法发出 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39211451/

相关文章:

javascript - 交付 ClojureScript 桌面应用程序的最正常方式是什么

javascript - 我需要在 for 循环中声明迭代器吗?

java - 使用中介模式的 Netbeans 平台项目 - 可能吗?

java - 为什么我的 WAR 文件仍然引用旧数据库服务器中的数据?

java - 如何使用java代码在jsp页面中查看excel文件?

java - 如何在java中运行sudo poweroff

java - 为什么这两个 JSP 文件之间存在差异?

javascript - Angular 路由仅有时有效

javascript - 如何使用nodejs将数组obj写入文件

Java:你能把Class转换成一个特定的接口(interface)吗?