# Tomcat/Struts2 Benutzer bestimmt Name der URL



## dmike (8. Dez 2011)

Hallo,

in der Web-Anwendung, die ich schreibe, kann der Benutzer eine persönliche Info-Seite im Web anlegen.
Die Anwendung selbst kann man unter http://www.server.de erreichen.
Dann legt der Anwender einen Namen für seine Info-Seite fest.  Zum Beispiel "chucks-persoenliche-seite"

Jetzt kann jeder unter 
http://wwww.server.de/chucks-persoenliche-seite
nachschauen was dort steht.

http://wwww.server.de/ ist also fest vorgegeben und "chucks-persoenliche-seite" wurde vom Anwender zuvor in einem entsprechenden Formular reingeflippert.

Vielleicht dumme Frage, aber wie lässt sich "chucks-persoenliche-seite" die ja auch völlig anders heißen kann auf eine bestimmte Struts-Action mappen? Uzw. immer auf die selbe Action.


----------



## dmike (8. Dez 2011)

Die Idee ist, dass der Servlet-Container falls eine URL nicht auf *.action oder *.css/*.js/etc. endet, eine Display.action aufruft (über einen Filter). In der möchte dann nachschauen ob http://www.server.de/chucks-info-seite als Datensatz in der Datenbank existiert oder nicht. Wenn ja sollen die Infos zu dieser "ID" einfach angezeigt werden.

Leider kann man per <filter-mapping>-Tag keine excludes vornehmen. Also so etwas geht ja leider nicht

[XML]
<filter-mapping>
    <filter-name>DisplayFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <exclude>/css/*,/js/*,/image/*</exclude>
    <exclude>*.action, *.css, *.js, *.png</exclude>
 </filter-mapping>
[/XML]


Ich habe also versucht die excludes einfach in der Filter-Klasse "URLFilter" nachzubauen

[XML]
    <filter>
        <description>Custom URL Filter</description>
        <display-name>Custom URL Filter</display-name>
        <filter-name>cuf</filter-name>
        <filter-class>de.web.filters.URLFilter</filter-class>
        <init-param>
            <param-name>HompagePresentation</param-name>
            <param-value>myHomepage/Display.action</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>cuf</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
[/XML]


Die URLFilter-Klasse schaut in der URL nach, ob es sich um etwas erlaubtes handelt (also keine *.action, *.jpg.usw.). Wenn das soweit ok ist, wird die Display.action Klasse aufgerufen, per sendRedirect(homepagePresentation);

Problem bei der Sache ist, dass jetzt keine *.css, *.js usw. Dateien an den Browser durchgereicht werden. Ich nehme an, dass das Mapping <url-pattern>/*</url-pattern> einfach zu stark und meine Idee mit dem exclude in der URLFilter Klasse nicht funslt.



```
public class URLFilter implements Filter {

        private static final Logger logger = Logger.getLogger(URLFilter.class);

        private String homepagePresentation;

        public void destroy() {
        }


        /* (non-Javadoc)
         * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
         */
        public void init(FilterConfig fConfig) throws ServletException {
           homepagePresentation = fConfig.getInitParameter("HomepagePresentation");
        }

        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
             if(shouldExclude(req)) {
                 chain.doFilter(req, res);
             }

             //Dispatch funktioniert nicht bei Struts2, deshalb ein Redirect
             ((HttpServletResponse) res).sendRedirect(homepagePresentation);
        }

        private boolean shouldExclude(ServletRequest req) {
            if(req instanceof HttpServletRequest) {
                HttpServletRequest hreq = (HttpServletRequest) req;
                return (   hreq.getRequestURI().endsWith(".css")
                        || hreq.getRequestURI().endsWith(".js"))
                        || hreq.getRequestURI().endsWith(".png")
                        || hreq.getRequestURI().endsWith(".jpg")
                        || hreq.getRequestURI().endsWith(".gif")
                        || hreq.getRequestURI().endsWith(".pdf")
                        || hreq.getRequestURI().endsWith(".action");
            }
            return false;
       }
}
```


----------



## dmike (13. Jan 2012)

Das Thema ist noch aktuell. Hat vielleicht jemand nen Tipp wie so etwas gehen könnten.



danke.


----------

