Spring Rest Service funktioniert nicht beim AJAX Aufruf

LitWeb

Mitglied
Hallo,

ich bin nun wieder dabei meinen Spring REST Webservice zu entwickeln.

Im allgemeinen, es wird eine verteilte Anwendung, die Maven / Soring Rest Anwendung läuft auf einem Tomcat über https erreichbar. Die Client Anwendung läuft auf einem normalen Apache Server unter Port 81.

Die Client Anwendung ist reines HTMl und JQuery.

In der Server Anwendung habe ich einen Testcontroller mit minimalen Daten die eine Action zurück geben soll.

Wenn ich nun den Controller und die Action direkt als URL im Browser aufrufe, dann wird der JSON String im Browser angezeigt.

Wenn ich nun aber einen AJAX Request mit der selben URL drin über die Client Anwendung schicke, dann kommt nichts zurück. Beim debuggen in der Konsole des Firefox steht als Status eine 0, was ich gar nicht nachvollziehen kann.

Ich poste nun mal alle relevanten Sachen.

pom.xml
Code:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	
	<modelVersion>4.0.0</modelVersion>
	<inceptionYear>2014</inceptionYear>
	<groupId>deconFmV5</groupId>
	<artifactId>decon-fm-v5</artifactId>
	<packaging>war</packaging>
	<version>0.0.1</version>
	<name>decon-fm-v5</name>
	<url>http://maven.apache.org</url>
  
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	</properties>
  
	<dependencies>
	    
	    <dependency>
	      <groupId>junit</groupId>
	      <artifactId>junit</artifactId>
	      <version>3.8.1</version>
	      <scope>test</scope>
	    </dependency>
		
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.16</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>3.1.1.RELEASE</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>3.1.1.RELEASE</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>3.1.1.RELEASE</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>3.1.1.RELEASE</version>
		</dependency>
		
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>3.1.1.RELEASE</version>
		</dependency>
		
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.5.6</version>
		</dependency>
		
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
		</dependency>
	</dependencies>
  
	<build>
		<finalName>decon-fm-v5</finalName>
	  
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
	  
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<configuration>
					<warName>decon-fm-v5</warName>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

web.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>

<!--<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >-->

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://java.sun.com/xml/ns/javaee"
		xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		id="WebApp_ID"
		version="2.5">
		
	<display-name>Decon FM V5</display-name>
	
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/decon-restservice.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<servlet>
		<servlet-name>deconWebservice</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value></param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>deconWebservice</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
</web-app>

decon-restservice.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:oxm="http://www.springframework.org/schema/oxm"
		xmlns:util="http://www.springframework.org/schema/util"
		xmlns:mvc="http://www.springframework.org/schema/mvc"
		xmlns:context="http://www.springframework.org/schema/context"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
			http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
			http://www.springframework.org/schema/oxm 
			http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd 
			http://www.springframework.org/schema/util 
			http://www.springframework.org/schema/util/spring-util-3.0.xsd">
	
	<mvc:annotation-driven/>
	
	<context:component-scan base-package="de.decon.fm.webservices"></context:component-scan>
	
	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
	
	<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
		<property name="contentType" value="text/plain"/>
	</bean>
</beans>

Der PgebaeudeController.java
Code:
package de.decon.fm.webservices;

import java.io.IOException;
import java.util.HashMap;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(value = "/gebaeude")
public class PgebaeudeController 
{
	@RequestMapping(value = "/list/", method = RequestMethod.GET, produces = {"application/json"})
	public @ResponseBody String getData()
	{
		HashMap<String, Object> data = new HashMap<String, Object>();
		data.put("id", 12);
		data.put("name", "Testgebäude");
		data.put("nr", "233");
		
		String json = "";
		ObjectMapper map = new ObjectMapper();
		
		try {
			json = map.writeValueAsString(data);
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
//		System.out.println(json);
		
		return json;
	}
}

Und nun noch die Client index.html
Code:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="ISO-8859-1">
		
		<script type="text/javascript" src="./library/externals/jquery/jquery_1.10.2_dev.js"></script>
		<script type="text/javascript">var jQuery_1_10_2 = $.noConflict(true);</script>
		
		<script type="text/javascript">
		jQuery_1_10_2(document).ready(function($) {
			var res = null;
			
			$.ajax({
				url : "https://localhost/decon-fm-v5/gebaeude/list/",
				type : "GET",
				dataType : "JSON",
				contentType : "application/json; charset=utf-8",
				data : JSON.stringify({
					id : "12",
					test : "test"
				}),
				success : function(data) {
					var result = JSON.parse(JSON.stringify(data));
					res = result;
				},
				error : function(jqXHR, exception) {
					console.log(jqXHR.status);
				},
				async : false
			});
			
			console.log(res);
		});
		</script>
		
		<title>Insert title here</title>
	</head>
	<body>
		
	</body>
</html>


Wenn ich nun im Browser die URL https://localhost/decon-fm-v5/gebaeude/list/ direkt aufrufe, dann bekomme ich im Browser folgende Ausgabe angezeigt.

Code:
{"id":12,"nr":"233","name":"Testgebäude"}

Beim direkten Browseraufruf wird in der Eclipse Konsole auch folgendes gelistet.

Code:
DEBUG: [Feb-18 09:05:03,994] web.servlet.DispatcherServlet - DispatcherServlet with name 'deconWebservice' processing GET request for [/decon-fm-v5/gebaeude/list/]
DEBUG: [Feb-18 09:05:03,994] method.annotation.RequestMappingHandlerMapping - Looking up handler method for path /gebaeude/list/
DEBUG: [Feb-18 09:05:03,995] method.annotation.RequestMappingHandlerMapping - Returning handler method [public java.lang.String de.decon.fm.webservices.PgebaeudeController.getData()]
DEBUG: [Feb-18 09:05:03,995] web.servlet.DispatcherServlet - Last-Modified value for [/decon-fm-v5/gebaeude/list/] is: -1
DEBUG: [Feb-18 09:05:03,998] method.annotation.RequestResponseBodyMethodProcessor - Written [{"id":12,"nr":"233","name":"Testgebäude"}] as "application/json" using [org.springframework.http.converter.StringHttpMessageConverter@19862c5b]
DEBUG: [Feb-18 09:05:03,998] web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'deconWebservice': assuming HandlerAdapter completed request handling
DEBUG: [Feb-18 09:05:03,998] web.servlet.DispatcherServlet - Successfully completed request

Wenn ich nun im Browser die index vom Client Teil aufrufe, dann passiert nichts, es scheint nichts aufgerufen zu werden, denn da wird selbst in der Eclipse Konsole nichts gelistet.

Könnt ihr mir bitte weiter helfen? Ich habe schon gegoogelt, aber komme nicht auf den Fehler den ich mache.

Vielen Danke für eure Hilfe, ich hoffe ich konnte alle wichtigen Informationen liefern.

Gruß Lit-Web
 
Zuletzt bearbeitet:
Ich konnte das Problem eingrenzen. Es liegt an Browsergeschichten.

Wenn ich die Client Sachen in das Server Projekt lege und den Client Code in die index.jsp packe, dann funktioniert alles wunderbar, weil dann beide Sachen über einen host laufen.

Sobald aber die Serveranwendung über eine seperate Adresse angesprochen werden soll, scheinen da Browser Sicherheitsprobleme aufzutreten.

Jemand ne Idee wie man das umgehen kann?
 
Zurück