Wie gehe ich mit statischen Inhalten in Spring MVC um?


200

Ich entwickle eine Webanwendung mit Spring MVC 3 und habe das DispatcherServletAbfangen aller Anfragen an '/' wie folgt (web.xml):

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

Dies funktioniert nun wie angekündigt. Wie kann ich jedoch mit statischen Inhalten umgehen? Früher, bevor ich RESTful-URLs verwendet habe, hätte ich zum Beispiel alle * .html abgefangen und an das gesendet DispatcherServlet, aber jetzt ist es ein anderes Ballspiel.

Ich habe einen Ordner / static /, der / styles /, / js /, / images / etc enthält, und möchte / static / * aus dem Ordner ausschließen DispatcherServlet.

Jetzt konnte ich statische Ressourcen zum Laufen bringen, als ich dies tat:

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app/</url-pattern>
  </servlet-mapping>

Aber ich möchte, dass es nette URLs hat (der Punkt, an dem ich Spring MVC 3 verwende), nicht die Zielseite www.domain.com/app/

Ich möchte auch keine Lösung, die an Tomcat oder einen anderen Servlet-Container gekoppelt ist, und da dies (relativ) wenig Verkehr ist, benötige ich keinen Webserver (wie Apache httpd) im Voraus.

Gibt es dafür eine saubere Lösung?



Antworten:


266

Da ich viel Zeit mit diesem Thema verbracht habe, dachte ich, ich würde meine Lösung teilen. Seit Frühjahr 3.0.4 wird ein Konfigurationsparameter aufgerufen <mvc:resources/>(mehr dazu auf der Referenzdokumentationswebsite ), mit dem statische Ressourcen bereitgestellt werden können, während das DispatchServlet weiterhin im Stammverzeichnis Ihrer Site verwendet wird.

Verwenden Sie dazu eine Verzeichnisstruktur, die wie folgt aussieht:

src/
 springmvc/
  web/
   MyController.java
WebContent/
  resources/
   img/
    image.jpg
  WEB-INF/
    jsp/
      index.jsp
    web.xml
    springmvc-servlet.xml

Der Inhalt der Dateien sollte folgendermaßen aussehen:

src / springmvc / web / HelloWorldController.java:

package springmvc.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorldController {

 @RequestMapping(value="/")
 public String index() {
  return "index";
 }
}

WebContent / WEB-INF / web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>

WebContent / WEB-INF / springmvc-servlet.xml:

<?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:context="http://www.springframework.org/schema/context"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.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">

    <!-- not strictly necessary for this example, but still useful, see http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-controller for more information -->
 <context:component-scan base-package="springmvc.web" />

    <!-- the mvc resources tag does the magic -->
 <mvc:resources mapping="/resources/**" location="/resources/" />

    <!-- also add the following beans to get rid of some exceptions -->
 <bean      class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
 <bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
 </bean>

    <!-- JSTL resolver -->
 <bean id="viewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass"
   value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
 </bean>

</beans>

WebContent / jsp / index.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<h1>Page with image</h1>
<!-- use c:url to get the correct absolute path -->
<img src="<c:url value="/resources/img/image.jpg" />" />

Hoffe das hilft :-)


12
Dieses Beispiel sollte im Spring-Benutzerhandbuch enthalten sein - es ist das Beste, das ich zu diesem Thema gesehen habe. Danke Joris!
Paul

Dies hat definitiv den Trick für mich getan - nur Rozkys Rat ist das, was ich angefangen habe, aber aus irgendeinem Grund hat jede Seite außer meiner Homepage die Ressourcen-URLs relativ zur Seite gerendert - wenn ich diesen Rat befolge, werden sie relativ stattdessen zum Kontext-Root meiner App - und funktioniert perfekt! Vielen Dank!
Bane

Vielen Dank! Ich habe mir die Haare ausgezogen, bis ich die Zeile <mvc: resources Mapping = "/ resources / **" location = "/, Klassenpfad: / META-INF / web-resources /" /> in <mvc: resources Mapping geändert habe = "/ resources / **" location = "/ resources /" />
Mark D

2
Wie @Bane hervorhob, ist der <c: url value = ... /> ein wesentlicher Bestandteil dieser Lösung. Würde es Ihnen (oder irgendjemandem) etwas ausmachen, mir zu sagen, warum? Vielen Dank!
Mark

4
Sie können auch <mvc: resources maps = "/ **" location = "/ resources /" /> verwenden und es wird dem Stamm zugeordnet. (dh: Der Stamm enthält sowohl Ressourcen als auch die JSPs). Dies kann Sie mit c: url überall retten
efaj

46

Dieses Problem wurde in Spring 3.0.4.RELEASE behoben, wo Sie das <mvc:resources mapping="..." location="..."/> Konfigurationselement in Ihrer Spring Dispatcher-Konfigurationsdatei verwenden können.

Überprüfen Sie die Federdokumentation


5
Obwohl nicht wirklich "falsch", ist diese Antwort zu kurz, da in Spring's eigener Dokumentation (die Sie als Ihre Antwort bezeichnet haben) etwas zu fehlen scheint. Überprüfen Sie Joris 'Antwort auf eine vollständigere Antwort ... nicht die Tatsache, dass sie langwierig ist, sondern die Tatsache, dass er die Verwendung von <c: url ...> erwähnt, die weder in Ihrer Antwort noch in Spring's Dox erwähnt wird - und die sich als erwiesen hat ein kritischer Teil der Lösung sein.
Bane

38

Fügen Sie in Spring 3.0.x Folgendes zu Ihrer servlet-config.xml hinzu (die Datei, die in web.xml als contextConfigLocation konfiguriert ist. Sie müssen auch den mvc-Namespace hinzufügen, aber googeln Sie einfach danach, wenn Sie nicht wissen, wie !;)

Das ist für mich in Ordnung

<mvc:default-servlet-handler/>

Grüße

Ayub Malik


Wenn ich diese Zeile hinzufüge, wird Folgendes angezeigt: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Zeile 31 im XML-Dokument aus der Klassenpfadressource [META-INF / spring / application-context.xml] ist ungültig. verschachtelte Ausnahme ist org.xml.sax.SAXParseException; lineNumber: 31; columnNumber: 35; cvc-complex-type.2.4.c: Der übereinstimmende Platzhalter ist streng, für das Element 'mvc: default-servlet-handler' kann jedoch keine Deklaration gefunden werden.
Alex Worden

Stellen Sie sicher, dass Sie die Reihenfolge des Handlers einhalten, wenn Sie auch andere Ansichtsauflöser haben.
Phoenix

20

Wenn ich Ihr Problem richtig verstehe, habe ich wahrscheinlich eine Lösung für Ihr Problem gefunden:

Ich hatte das gleiche Problem, bei dem die Rohausgabe ohne CSS-Stile, Javascripts oder JQuery-Dateien angezeigt wurde.

Ich habe gerade Zuordnungen zum "Standard" -Servlet hinzugefügt. Der Datei web.xml wurde Folgendes hinzugefügt:

 <servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
 </servlet-mapping>

Dies sollte die Javascript- und CSS-Dateianforderungen aus dem DispatcherRequest-Objekt herausfiltern.

Auch hier bin ich mir nicht sicher, ob du danach suchst, aber es hat bei mir funktioniert. Ich denke, "Standard" ist der Name des Standardservlets in JBoss. Ich bin mir nicht sicher, was es für andere Server ist.


1
Ich möchte eigentlich nicht das Standard-Servlet verwenden, das mich mit jboss / tomcat koppelt
hamo

@hamo warum ist das ein problem (Dies ist eine echte Frage, keine argumentative Erwiderung). Sie müssen den Server (jboss / tomcat / jetty) sowieso ausführen, damit der Frühling ausgeführt werden kann, oder?
Manav

3
Und Sie können alle <url-pattern>Tags innerhalb derselben hinzufügen<servlet-mapping>
Milanka

16

Es gibt einen weiteren Stapelüberlaufpfosten, der eine hervorragende Lösung bietet .

Es scheint nicht Tomcat-spezifisch zu sein, ist einfach und funktioniert hervorragend. Ich habe einige der Lösungen in diesem Beitrag mit Spring MVC 3.1 ausprobiert, hatte dann aber Probleme, meinen dynamischen Inhalt bereitzustellen.

Kurz gesagt heißt es, eine Servlet-Zuordnung wie folgt hinzuzufügen:

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/images/*</url-pattern>
</servlet-mapping>

11

Ich habe mit tuckeys urlrewritefilter einen Weg gefunden, das zu umgehen. Bitte zögern Sie nicht, eine bessere Antwort zu geben, wenn Sie eine haben!

In web.xml:

<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

  <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>/app/*</url-pattern>
  </servlet-mapping>

In urlrewrite.xml:

<urlrewrite default-match-type="wildcard">
<rule>
    <from>/</from>
    <to>/app/</to>
</rule>
<rule match-type="regex">
    <from>^([^\.]+)$</from>
    <to>/app/$1</to>
</rule>
<outbound-rule>
    <from>/app/**</from>
    <to>/$1</to>
</outbound-rule>    

Dies bedeutet, dass jeder Uri mit einem '.' Darin (wie zum Beispiel style.css) wird nicht neu geschrieben.


5
Die bessere Antwort ist Spring 3 <mvc:resources/>, wie @Joris zeigt.
Paul

11

Ich habe mich gerade mit diesem Problem in Spring MVC 3.0 auseinandergesetzt und mich zunächst für die Option UrlRewriteFilter entschieden. Ich war jedoch nicht zufrieden mit dieser Lösung, da sie sich "nicht richtig anfühlte" (ich bin nicht die einzige - siehe den obigen Link zu den Frühlingsforen, in denen das Wort "Hack" einige Male vorkommt).

Daher habe ich eine ähnliche Lösung wie "Unbekannt (Google)" oben entwickelt, mir aber die Idee geliehen, dass alle statischen Inhalte von / static / (aus der Spring Roo-Version der Pet Store-App) bereitgestellt werden. Das "Standard" -Servlet hat bei mir nicht funktioniert, das Spring Webflow ResourceServlet jedoch (ebenfalls aus der von Spring Roo generierten App).

Web.xml:

<servlet>
    <servlet-name>mainDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet>
    <servlet-name>Resource Servlet</servlet-name>
    <servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>mainDispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>Resource Servlet</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

Die einzige Änderung, die ich an JSPs vorgenommen habe, war das Hinzufügen des / static / -Pfads zu URLs für CSS, JS und Bilder. Beispiel "$ {pageContext.request.contextPath} /static/css/screen.css".

Für Maven-Benutzer lautet die Abhängigkeit für "org.springframework.js.resource.ResourceServlet":

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>org.springframework.js</artifactId>
    <version>2.0.8.RELEASE</version>
</dependency>

Keine schlechte Lösung Nickdos - danke! Ich verstehe immer noch nicht, warum es in Core Spring MVC kein Ressourcenservlet gibt (anstatt eine weitere Abhängigkeit mit dem Webflow hinzufügen zu müssen) oder eine andere sofort einsatzbereite Lösung. Urlrewrite funktioniert gut für mich, also bleibe ich vorerst dabei! Prost, Hamo
13.

2
Beim Rückblick auf die Standardversion (ohne Roo) der Spring Pet Clinic-App habe ich festgestellt, dass die Servlet-Definition für "Standard" mit dem zusätzlichen Kommentar "Kommentar in Containern (GlassFish), die dies nicht deklarieren, auskommentiert ist implizite Definition out of the box ". Die explizite Paketdeklaration für den Standardwert lautet org.apache.catalina.servlets.DefaultServlet. Dies kann also Ihr "out of the box" -Ressourcenservlet sein (?). Ich benutze Jetty für Entwicklungsarbeiten und es scheint, dass Jetty kein implizites Standardservlet (wie Glassfish) bereitstellt.
Nickdos

8

Meine eigenen Erfahrungen mit diesem Problem sind wie folgt. Die meisten Spring-bezogenen Webseiten und Bücher scheinen darauf hinzudeuten, dass die am besten geeignete Syntax die folgende ist.

    <mvc:resources mapping="/resources/**" location="/resources/" />

Die obige Syntax schlägt vor, dass Sie Ihre statischen Ressourcen (CSS, JavaScript, Bilder) in einem Ordner mit dem Namen "resources" im Stammverzeichnis Ihrer Anwendung ablegen können, dh / webapp / resources /.

Nach meiner Erfahrung (ich verwende Eclipse und das Tomcat-Plugin) funktioniert dies jedoch nur, wenn Sie Ihren Ressourcenordner in WEB_INF (oder META-INF) ablegen. Die von mir empfohlene Syntax lautet also wie folgt.

    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />

Verweisen Sie in Ihrer JSP (oder ähnlichem) wie folgt auf die Ressource.

<script type="text/javascript"
        src="resources/my-javascript.js">
</script>

Unnötig zu erwähnen, dass die gesamte Frage nur auftauchte, weil ich wollte, dass mein Spring Dispatcher-Servlet (Front-Controller) alles abfängt, alles Dynamische, das heißt. Also habe ich folgendes in meiner web.xml.

<servlet>
    <servlet-name>front-controller</servlet-name>
    <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    <!-- spring automatically discovers /WEB-INF/<servlet-name>-servlet.xml -->
</servlet>

<servlet-mapping>
    <servlet-name>front-controller</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Da ich aktuelle Best Practices verwende, habe ich Folgendes in meiner Servlet-XML für den Front-Controller (siehe oben).

<mvc:annotation-driven/>

In meiner eigentlichen Controller-Implementierung habe ich Folgendes, um sicherzustellen, dass ich eine Standardmethode zur Verarbeitung aller eingehenden Anforderungen habe.

@RequestMapping("/")

Ich hoffe das hilft.


Das war die einzige Lösung, die für mich funktioniert hat. Eine interessante Sache, die mir aufgefallen ist, ist, dass neue Ressourcen, die nach dem Start der Webanwendung hinzugefügt wurden, erst nach einem Neustart gefunden wurden. Aus Anwendersicht nicht sinnvoll, sollte aber meistens kein großes Problem sein.
Rafael Steil

Sie sagten mit Tomcat Perspektive,
super

Ich habe jede Antwort auf dieser Seite ausprobiert. Zum Glück muss ich es nicht mehr versuchen, als ich zu diesem kam.
TimeTrax

6

Ich hatte das gleiche Problem und fand Joris 'Antwort sehr hilfreich. Aber zusätzlich muss ich hinzufügen

<mvc:annotation-driven /> 

in die Servlet-Konfigurationsdatei. Ohne diese Funktion funktioniert die Ressourcenzuordnung nicht und alle Handler funktionieren nicht mehr. Hoffe das wird jemandem helfen.


2

Das URLRewrite ist eine Art "Hack", wenn Sie es so nennen möchten. Es kommt darauf an, dass Sie das Rad neu erfinden. da gibt es bereits bestehende lösungen. Eine andere Sache, an die Sie sich erinnern sollten, ist HTTP-Server = statischer Inhalt & App-Server = dynamischer Inhalt (so wurden sie entworfen). Indem Sie die entsprechenden Verantwortlichkeiten an jeden Server delegieren, maximieren Sie die Effizienz ... aber heutzutage ist dies wahrscheinlich nur in leistungskritischen Umgebungen ein Problem, und so etwas wie Tomcat würde höchstwahrscheinlich die meiste Zeit in beiden Rollen gut funktionieren. aber es ist trotzdem etwas zu beachten.


2

Ich habe es so gelöst:

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>

Dies funktioniert bei Tomcat und natürlich bei Jboss. Am Ende entschied ich mich jedoch für die Lösung, die Spring (wie von rozky erwähnt) bietet und die weitaus portabler ist.


2

Ich habe beide Methoden verwendet, nämlich URLrewrite und Annotation basierend auf Spring MVC 3.0.x, und fand, dass Annotation Based Approach am besten geeignet ist

<annotation-driven />

<resources mapping="/resources/**" location="/resources/" />

Im Falle von urlrewrite müssen viele Regeln definiert werden und einige Zeit auch Klasse nicht gefundene Ausnahme für UrlRewriteFilter erhalten, da bereits die Abhängigkeit dafür vorgesehen ist. Ich habe festgestellt, dass dies aufgrund des Vorhandenseins einer transitiven Abhängigkeit geschieht. Daher wird ein Schritt erneut erhöht und diese Abhängigkeit muss mit pom.xml ausgeschlossen werden

<exclusion></exclusion> tags.

Ein auf Anmerkungen basierender Ansatz wird also das gute Geschäft sein.


2

Ab Frühjahr 3 müssen alle Ressourcen auf andere Weise zugeordnet werden. Sie müssen das Tag verwenden, um den Speicherort der Ressourcen anzugeben.

Beispiel:

<mvc:resources mapping="/resources/**" location="/resources/" />

Auf diese Weise weisen Sie das Dispatcher-Servlet an, in den Verzeichnisressourcen nach dem statischen Inhalt zu suchen.


1

Meine Art, dieses Problem zu lösen, besteht darin, alle Ihre Aktionen mit einem bestimmten Präfix wie "Web" oder "Service" zu versehen und zu konfigurieren, dass alle URLs mit diesem Präfix vom DispatcherServlet abgefangen werden.


1

Ich füge nur drei Regeln vor der Spring-Standardregel (/ **) zu Tuckeys URLrewritefilter (urlrewrite.xml) hinzu, um das Problem zu lösen

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" "http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
    <urlrewrite default-match-type="wildcard">
     <rule>
      <from>/</from>
      <to>/app/welcome</to>
     </rule>
     <rule>
      <from>/scripts/**</from>
      <to>/scripts/$1</to>
     </rule>
     <rule>
      <from>/styles/**</from>
      <to>/styles/$1</to>
     </rule>
     <rule>
      <from>/images/**</from>
      <to>/images/$1</to>
     </rule>
     <rule>
      <from>/**</from>
      <to>/app/$1</to>
     </rule>
     <outbound-rule>
      <from>/app/**</from>
      <to>/$1</to>
     </outbound-rule> 
    </urlrewrite>

1

Ich weiß, dass es einige Konfigurationen gibt, um den statischen Inhalt zu verwenden, aber meine Lösung besteht darin, dass ich nur einen Massenordner für Webanwendungen in Ihrem Tomcat erstelle. Diese "Bulk-Webanwendung" stellt nur alle statischen Inhalte bereit, ohne Apps bereitzustellen. Dies ist eine schmerzfreie und einfache Lösung, um statische Inhalte für Ihre eigentliche Spring-Webanwendung bereitzustellen.

Zum Beispiel verwende ich zwei Webapp-Ordner auf meinem Tomcat.

  1. springapp : Es wird nur eine Spring-Webanwendung ohne statische Inhalte wie imgs, js oder css ausgeführt. (speziell für Frühlings-Apps.)
  2. Ressourcen : Es werden nur die statischen Inhalte ohne JSP, Servlet oder irgendeine Art von Java-Webanwendung bereitgestellt. (speziell für statische Inhalte)

Wenn ich Javascript verwenden möchte, füge ich einfach den URI für meine Javascript-Datei hinzu.

EX> /resources/path/to/js/myjavascript.js

Für statische Bilder verwende ich dieselbe Methode.

EX> /resources/path/to/img/myimg.jpg

Zuletzt habe ich meinem Tomcat eine " Sicherheitsbeschränkung " auferlegt, um den Zugriff auf das eigentliche Verzeichnis zu blockieren. Ich habe die Benutzerrolle "Nobody" auf die Einschränkung gesetzt, sodass die Seite "403 verbotener Fehler" generiert, wenn Leute versuchen, auf den Pfad für statische Inhalte zuzugreifen.

Bisher funktioniert es sehr gut für mich. Mir ist auch aufgefallen, dass viele beliebte Websites wie Amazon, Twitter und Facebook unterschiedliche URI für die Bereitstellung statischer Inhalte verwenden. Um dies herauszufinden, klicken Sie einfach mit der rechten Maustaste auf einen statischen Inhalt und überprüfen Sie dessen URI.


1

Dies hat in meinem Fall den eigentlichen Job gemacht

in web.xml:

...
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/images/*</url-pattern>
    <url-pattern>/css/*</url-pattern>
    <url-pattern>/javascripts/*</url-pattern>
</servlet-mapping>


<servlet-mapping>
    <servlet-name>spring-mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

...


1

Für die Java-basierte Federkonfiguration können Sie Folgendes verwenden

Verwenden von ResourceHandlerRegistry, in dem Registrierungen von Ressourcenhandlern für die Bereitstellung statischer Ressourcen gespeichert werden.

Weitere Informationen @ WebMvcConfigurerAdapter, der Rückrufmethoden zum Anpassen der Java-basierten Konfiguration für Spring MVC definiert, die über @EnableWebMvc aktiviert wurde.

@EnableWebMvc
@Configurable
@ComponentScan("package.to.scan")
public class WebConfigurer extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static_resource_path/*.jpg").addResourceLocations("server_destination_path");

    }

0

Nachdem ich denselben hier beschriebenen Entscheidungsprozess erlebt und durchlaufen hatte, entschied ich mich für den ResourceServlet-Vorschlag, der sehr gut funktioniert.

Beachten Sie, dass Sie hier weitere Informationen zur Verwendung von Webflow in Ihrem Maven-Erstellungsprozess erhalten: http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch01s05.html

Wenn Sie das standardmäßige zentrale Maven-Repository verwenden, ist das Artefakt (im Gegensatz zum oben genannten Springsource-Bundle):

<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>spring-js</artifactId>
    <version>2.0.9.RELEASE</version>
</dependency> 

0

Dies kann auf mindestens drei Arten erreicht werden.

Lösungen :

  • Stellen Sie den HTML-Code als Ressourcendatei bereit
  • Weisen Sie das JspServlet an, auch * .html-Anforderungen zu verarbeiten
  • Schreiben Sie Ihr eigenes Servlet (oder übergeben Sie es an andere vorhandene Servlet-Anforderungen an * .html).

Für vollständige Codebeispiele, wie dies erreicht werden kann, verweisen wir auf meine Antwort in einem anderen Beitrag: Wie ordne ich Anfragen einer HTML-Datei in Spring MVC zu?


0

Das Problem liegt bei URLPattern

Ändern Sie Ihr URL-Muster in Ihrer Servlet-Zuordnung von "/" in "/ *".


0
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:default-servlet-handler/>
</beans>

Wenn Sie eine annotationsbasierte Konfiguration verwenden möchten, verwenden Sie den folgenden Code

@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

0

Platzieren Sie statische Inhalte wie css, js im folgenden Pfad

resources 
        ->static
               ->css
               ->js
(or) 
resources 
        ->public
               ->css
               ->js
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.