2010-12-08 5 views
0

Je configure une application Web sur GlassFish et je me demande s'il existe un moyen de configurer le mappage de servlet à partir de la racine de l'URL pour ne l'appliquer que dans les cas où un fichier ou un répertoire n'existe pas à l'URL spécifiée.Mappage de servlet: uniquement lorsqu'un fichier ou un répertoire n'existe pas?

Actuellement, cela routent tout à travers mon répartiteur de printemps:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
      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_3_0.xsd" 
      version="3.0"> 
<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class> 
    org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 
<welcome-file-list> 
    <welcome-file> 
    /jsp/index.jsp 
    </welcome-file> 
</welcome-file-list> 
</web-app> 

Est-il possible de conserver une certaine façon le comportement ci-dessus, sauf si un fichier ou un répertoire existe à un chemin donné? Est-ce que j'essaie de résoudre ce problème au mauvais endroit?

MISE À JOUR: Qu'en est-il de la réécriture d'URL? Est-ce que GlassFish offre un degré de flexibilité comme Apache avec mod_rewrite? De cette façon, je pourrais intercepter des choses avant même qu'il n'atteigne l'étape de mappage de servlet.

Répondre

1

Hacky, mais faisable: le mappez comme <error-page> sur un <error-code> de 404. Vous voudrez peut-être changer le code d'état dans la servlet chaque fois que vous voulez retourner une réponse "valide".

Une alternative est de laisser la servlet Spring écouter sur un url-pattern plus spécifique. Par exemple. /pages/*. Vous pouvez ensuite si nécessaire apporter un Filter devant (sur /*) qui fait à peu près ce qui suit:

if (new File(servletContext.getRealPath(request.getRequestURI())).exists()) { 
    chain.doFilter(request, response); 
} else { 
    request.getRequestDispatcher("/pages" + request.getRequestURI()).forward(request, response); 
} 

de sorte que vous ne voyez pas//pages dans l'URL.


Mise à jour: selon votre nouvelle question:

MISE À JOUR: Qu'en est-il de réécriture d'URL? Est-ce que GlassFish offre un degré de flexibilité comme Apache avec mod_rewrite? De cette façon, je pourrais intercepter des choses avant même qu'il n'atteigne l'étape de mappage de servlet.

L'équivalent JSP/Servlet addon mod_rewrite Apache httpd est le Tuckey's UrlRewriteFilter.

Questions connexes