DWR - Probleme mit Konfiguration

Tarantoga

Aktives Mitglied
Hey,
ich versuche DWR in ein Spring MVC WebProjekt einzubauen. Dabei möchte ich jetzt noch gar keine bestimmten Funktionen implementieren, sondern einfach das Ganze einmal zum Laufen bringen.
So weit so schlecht.

1) Ich habe sowohl dwr.jar als auch commons-logging.jar im lib Verzeichnis.

2) Die Testseite sieht so aus:

HTML:
<script type="text/javascript" src="/DWR/dwr/engine.js"></script>
		<script type="text/javascript" src="/DWR/dwr/util.js"></script>
		<script type="text/javascript" src="/DWR/dwr/interface/dwrService.js"></script>
	
                <script type="text/javascript">
                    function getStuff() { 
  dwr.util.setValue("test", "Hallo");
                   }
  </script>

<input type="button" onclick="getStuff()" value="Button">
                
                <div id="test">
                    
                </div>

Das funktioniert soweit, also ich kann zumindest auf die dwr-Bibliotheken zugreifen.

Jetzt zum Problem:

Ich kann keine Java-Methoden im Script aufrufen.
Es fängt ja schon damit an, dass ich nicht weis wie ich das ganze konfigurieren soll.
Mittels dwr.xml scheint angeblich veraltet zu sein, also habe ich es zuerst mit annotations versucht(benutze ich sehr gerne bei @MVC Controllern), bin aber gescheitert.
Danach habe ich es mit dem Spring namespace versucht, aber auch noch keinen Erfolg gehabt.

Hab mir schon die Documentation durchgelesen und tagelang gegoogelt. Ich werd einfach nicht schlau daraus.
Letzter Stand meines ApplicationContext ist:

[XML]<dwr:controller id="dwrController" debug="true" />

<dwr:url-mapping />

<dwr:configuration/>



<dwr:annotation-config id="ac" />


<bean id="Demo" class="com.ah.controller.Demo">
<dwr:remote javascript="Demo">
<dwr:include method="sayHello" />
</dwr:remote>
</bean>[/XML]

Im deployment-descriptor ist das dispatcher-servlet auch auf /dwr/* gemappt!


Der ServorLog zeigt mir auch einen Error bzw. auch ein PopUp Error im Browser (CSRF)

[XML]INFO: WEB0671: Loading application [DWR] at [/DWR]
INFO: DWR wurde erfolgreich bereitgestellt in 4.015 Millisekunden.
INFO: 4168 [http-thread-pool-8080(2)] ERROR org.directwebremoting.impl.DefaultCreatorManager -Class not found: 'dwrService'

INFO: 4168 [http-thread-pool-8080(2)] WARN org.directwebremoting.impl.DefaultCreatorManager -Names of known classes are: __Data Demo __System

INFO: 4169 [http-thread-pool-8080(2)] WARN org.directwebremoting.servlet.ExceptionHandler -Error: java.lang.SecurityException: Class not found

INFO: 5247 [http-thread-pool-8080(3)] ERROR org.directwebremoting.dwrp.BaseDwrpHandler -A request has been denied as a potential CSRF attack.

INFO: 5247 [http-thread-pool-8080(3)] WARN org.directwebremoting.dwrp.BaseCallHandler -Exception while processing batch
java.lang.SecurityException: CSRF Security Error[/XML]

Ich seh die Fehler, finde aber keine Lösung.
Vielleicht könnte jemand mit Erfahrung in Spring mit DWR mir einen kleinen Anstoß in die richtige Richtung geben.
Danke schonmal,
Tarantoga
 
So, hatte doch gerade ein wenig Zeit.

Folgendes funktioniert bei mir:

Java:
@Service
@RemoteProxy(name = "Greeter")
public class Greeter {
    @RemoteMethod
    public String greet() {
        return "Hello world!";
    }
}

WEB-INF/web.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>[/XML]

WEB-INF/spring-servlet.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd Index of /schema/context http://www.springframework.org/schema/context/spring-context-3.0.xs Index of /schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">

<context:annotation-config />
<context:component-scan base-package="de.mvitz.examples.dwr.spring.annotation" />

<dwr:configuration />
<dwr:annotation-config />
<dwr:controller>
<dwr:config-param name="crossDomainSessionSecurity" value="false" />
</dwr:controller>
<dwr:url-mapping />

</beans>[/XML]

index.html
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Greeter!</title>
        <script type="text/javascript" src="dwr/interface/Greeter.js"></script>
        <script type="text/javascript" src="dwr/engine.js"></script>
        <script type="text/javascript">
          function greet() {
            Greeter.greet(function(data) {
              alert(data);
            });
          }
        </script>
    </head>
    <body>
        <h1>Greeter!</h1>
        <form>
            <p>
                <input type="button" value="Greet!" onclick="greet();" />
            </p>
        </form>
    </body>
</html>

Hoffe das hilft dir fürs erste.
 
Wow danke, werde mich gleich dran machen. 😉

EDIT:
ICh weiß nicht, aber es will einfach nicht funktionieren.
Entweder liegt es daran, dass ich kein Maven benutze, obwohl ich eig. alle relevanten Jars drin habe.

Oder an meiner allg. Konfiguration.
Zb. steht in allen Tutorials zu Spring MVC dass man zum ControllerAnnotation Scannen nur den <context:component-scan> braucht.
Bei mir funktionierte es aber erst nach hinzufügen von:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

???
 
Zuletzt bearbeitet:
Hi,
Spring ist die Version 3.0.2
Bei den Jars brauche ich dochnur dwr.jar und comms-logging-1.1.jar, oder?

Ansonsten habe ich in meinem Testprojekt noch:
log4j-1.2.12.jar
org.springframework.aop-3.0.4.jar
bzw. alle die in der Beispiel App. der DWR Homepage angeboten sind.
(Butter Dev - David Marginian - Java Web Developer)


Außerdem legt Netbeans das lib Verzeichnis per Default nicht nach WEB-INF, sondern ganz einfach ins Root Verzeichnis.
Könnte es daran liegen?

EDIT:

bzw. wie schon oben erwähnt funktioniert DWR bereits!
Ich kann util.js und engine.js verwenden.

Nur das Zugreifen auf Java-Methoden will nicht funktionieren. Irgendwie muss es da an der Konfiguration scheitern.

mfg
Tarantoga


EDIT 2:

Ich habe Fortschritte gemacht!
Beim aufrufen der Javascript im Browser, die wiederum eine Java-Funktion ausführt, wird jetzt ein CSRF Security Error geworfen!
Vorher ist einfach nichts passiert.
(btw. Ich machs jetzt ohne Annotations und konfiguriere es via XML)

Ich denke ich kommer der Lösung immer näher. Wie bekomme ich nun noch den Error weg?

spring-servelt.xml (Habe der Einfachheit halber mal Alles da reingepackt)
[XML] <context:annotation-config />
<context:component-scan base-package="org.krams.tutorial.controller" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>



<dwr:controller id="dwrController" debug="true" />

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property value="true" name="alwaysUseFullPath"></property>
<property name="mappings">
<props>
<prop key="/dwr/**/*">dwrController</prop>
</props>
</property>
</bean>

<bean class="org.krams.tutorial.service.ArithmeticService" id="Greeter">
<dwr:remote javascript="Greeter">
<dwr:include method="greet"/>
</dwr:remote>
</bean>



<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p😛refix="/WEB-INF/jsp/"
p:suffix=".jsp" />
[/XML]

index.jsp
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Greeter!</title>
        <script type="text/javascript" src="/Krams/dwr/interface/Greeter.js"></script>
        <script type="text/javascript" src="/Krams/dwr/util.js"></script>
        <script type="text/javascript" src="/Krams/dwr/engine.js"></script>
       
        <script type="text/javascript">
          function greet() {
            Greeter.greet(function(data) {
              alert(data);
            });
          }
          function hello(){
              dwr.util.setValue("text", "Hallo");
          }
        </script>
    </head>
    <body>
        <h1>Greeter!</h1>
        <form action="#">
            <p>
                <input type="button" value="Greet!" onclick="greet();" />
                 <input type="button" value="Hallo" onclick="hello()" />          
            </p>
        </form>
         
        <div id="text">
            
        </div>
    </body>
</html>


Habe gelesen, dass es daran liegen könnte, dass HttpOnly per Default true ist.

Wenn ich in der web.xml nun folgendes konfiguriere:
[XML]<session-config>
<cookie-config>
<http-only>false</http-only>
</cookie-config>
</session-config>[/XML]

Bekomme ich diesen Fehler:
Code:
SCHWERWIEGEND: Ausnahmefehler bei der Bereitstellung der Anwendung [Krams] : org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'cookie-config'. One of '{"http://java.sun.com/xml/ns/j2ee":session-timeout}' is expected.

Was muss ich da nun tun?
Muss man da einen Namespace hinzufügen?


Tausend Dank schon mal.
 
Zuletzt bearbeitet:
Bei meinen ersten Versuchen hatte ich den Fehler auch und habe deswegen
[XML]<dwr:controller>
<dwr:config-param name="crossDomainSessionSecurity" value="false" />
</dwr:controller>[/XML]
genutzt.
Bei den Projekten die du auf Github findest, war das dann komischerweise nicht mehr nötig.
 
Sry,
muss noch eine Frage dranhängen. 😉

Ich hab in der JSP die Pfade zu den jeweiligen Interfaces der Java Klassen angegeben. Jedoch findet er die Datein nicht wenn ich den Namen der aktuellen webapp bei src="" angebe.
Wenn ich den namen der WebApp eingebe, aus der ich den Code rüberkopiert habe, funktionierts, aber auch nur die alten Klassen. Die, die ich neu geschrieben habe funktionieren so und so nicht.

Meine Frage wäre also: Wohin speichert DWR die umgewandelten Java Klassen per Default?
Damit ich richtige Pfade angeben kann.

Dankeschön.
 
Wenn du mit src="" das <script src=""> aus der JSP meinst, dann ist der Pfade eben immer /<webbappname>/<dwrmapping>/interface/<komponentnname>.js

Unter JSP kannst du dir das hartcodieren des WebAppNamens sparen, wenn du mit dem JSTL Tag <c:url ...> arbeitest.
 
Genau das meine ich.

Nur heißt mein momentaner WebApp "Test", zuvor habe ich mit dem "Krams" BeispielApp herumexperimentiert.
Dann habe ich den JSP Code einfach rüberkopiert nach "Test".
Also in "Test" steht in der JSP nun "/Krams/dwr/interface/People.js".

Das funktioniert, aber wenn ich nun "Krams" durch "Test" ersetze (wie es doch eig. gehört) geht es nicht mehr.
Also wo legt DWR eig. die umgewandelten Klassen ab? Auf was müsste ich da mit <c:url > refernzieren?
bzw. warum kann ich statt "Krams" nicht einfach "Test" einsetzen, wie man es doch erwarten würde?

LG
Tarantoga
 
Du kannst garantiert Krams durch Test ersetzen. Ich vermute die Probleme liegen bei dir an einer ganz anderen Stelle. Dafür spricht auch, dass du wie bereits oben gesagt Probleme mit den Spring Shortcuts hast.

Für eine detailiertere Analyse könntest du ja einfach mal dein Projekt hochladen.
 
Du hattest Recht, im Deployment Descriptor fehlte noch was beim Mapping vom Dispatcher Servlet.
Trotzdem wundert mich, dass ich auf den Pfad mit "Krams" überhaupt zugreifen konnte, da die App nichtmal Deployed oder sonstwas war.
Ich nehme einmal an die Files werden von DWR genriert und bis zu einer Änderung des Codes nicht mehr upgedatet?
LG
 

Zurück
Oben