2016-08-29 116 views
1

我有兩個不同的java項目,我需要它們互相交互。第一個名爲RESTfulWebServer的是一個動態Web項目,它包含名爲UserServices的Java類中的基本HTTP GET PUT POST請求。它只是在控制檯(netbeans中的輸出窗口)上打印一行語句,所以沒什麼複雜的。Javascript功能無法發出HTTP請求

另一個名爲ClientProject的項目也是一個動態Web項目,它包含一個簡單的包含JavaScript代碼的jsp頁面。它應該調用RESTfulWebServer項目並在控制檯(netbeans中的輸出窗口)上輸出輸出行,這與RESTfulWebServer項目在執行簡單的GET請求時執行的方式相同。

這是問題出現的部分。當我運行ClientProject時,正在調用javascript函數(正如我通過打印警報消息所檢查的那樣),但它並沒有按照它的要求向RESTfulWebServer發出DELETE HTTP請求。

這兩個代碼如下附:

RESTfulWebServer(UserServices.java)

<%@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> 

的clientfile應該

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)在控制檯上打印「內部DELETE用戶方法」,但沒有在c上顯示「建立成功」消息後的鞋墊

我在做什麼錯?此外,我正在使用TomCat服務器,並在NetBeans中執行此操作,並且因爲某些原因(如果在我的代碼中存在任何錯誤或任何其他錯誤,請不要轉移到任何其他IDE並檢查它),我必須完全在此IDE上工作其他請參閱提及嗎?

+0

你是否在不同的端口上運行兩個單獨的Tomcat實例? –

+0

我不這麼認爲,但我不確定。你能告訴我如何檢查是否是這種情況? – DD25

+0

客戶端或服務器端的問題在哪裏?對我來說,客戶端看起來很好,只需檢查您的服務器是否可以在8080端口上進行偵聽,還可以檢查http/https配置 – Viney

回答

0

首先從請求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

使用 Filter
<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

現在這樣調用方法從只有方法的註解視圖頁面添加

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

最後一件事,你將不得不作出的Tomcat的兩個服務器實例部署,分別爲它們命名服務和客戶端服務器爲您提供方便,同時使他們。讓服務擁有所有默認配置,但您必須更改Client Server的全部三個端口號以避免綁定錯誤。爲此,只需雙擊服務器(客戶端),請參閱端口標題和更改端口。

全部完成,現在應該運行,測試以及。希望這會幫助你和其他線程的讀者。

+1

非常感謝,這非常有幫助! – DD25