[j2ee] uitsluiten van een url in servlet mapping

Pagina: 1
Acties:

  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Voor mijn werk ben ik bezig met een URL rewriting/filtering systeem.
Een servlet vangt alle url's die binnenkomen af via de volgende servlet mapping:
code:
1
2
3
4
    <servlet-mapping>
         <servlet-name>Gate</servlet-name>
         <url-pattern>*</url-pattern>
    </servlet-mapping>
Het probleem is nu dat ik bepaalde mappings niet wil doorgeven aan deze servlet. Bijvoorbeeld de request: http://localhost/rewriter/data wil ik niet doorgeven aan deze servlet omdat op deze locatie puur HTML staat die ik wil publiceren. Maar bijvoorbeeld een URL als http://localhost/rewriter/1/2/3/4/5 mag weer wel doorgegeven worden.

Ik heb wat geprobeerd maar het is volgens mij niet mogelijk om een regular expression op te geven voor deze servlet mapping, een regexp als "^((?!data).)*$" zou volstaan om het probleem op te lossen, helaas werkt dit dus niet.

Is er een manier om dit (simpele) probleem op te lossen?

[ Voor 3% gewijzigd door oogapp0ltje op 08-08-2006 11:14 ]

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • kasper_vk
  • Registratie: Augustus 2002
  • Laatst online: 08-04-2025
Wil je die uit te sluiten mappings alleen maar niet doorgeven aan de servlet, dan kun je een servlet-filter schrijven, die toepassen op de te filteren mapping en in de filter een alternatieve afhandeling regelen.

Misschien dus dat servlet-filters uitkomst bieden.

The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' but 'That's funny...'


  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Bedankt! Dat zou het probleem inderdaad moeten oplossen.

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 14-12-2025

jAnO!

lalalavanillevla

Je zou het kunnen oplossen door dit eerst in je httpserver af te vangen.

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
jAnO! schreef op dinsdag 08 augustus 2006 @ 11:28:
Je zou het kunnen oplossen door dit eerst in je httpserver af te vangen.
Het draait in JBoss (direct in webcontainer van Tomcat dus). Dus er zit geen apache voor ofzo, als dat is wat je bedoelt. Ik ben nu bezig met het schrijven van een Filterclass, ik hoop dat dat werkt.

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • Glabbeek
  • Registratie: Februari 2001
  • Laatst online: 12-02 11:54

Glabbeek

Dat dus.

Het is ondertussen twee jaar geleden, maar ik herinner mij het volgende topic nog: \[Java/J2EE] Filters, excluding URL pattern?

Hier is het probleem eigenlijk hetzelfde; de oplossing ook. Zie mijn eerste post in het topic voor een idee hoe het filter eruit kan zien :)

En zo is het maar net.


  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 14-12-2025

jAnO!

lalalavanillevla

ah, ok.

Je kan natuurlijk ook een tweede servlet (lijkt heel erg op filter oplossing
) maken die redirect naar de gevraagde url, in je mapping
laat je die matchen op data.
De container pakt altijd de mapping die het exactste matcht.

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
De javax.servlet.Filter class is inderdaad de beste oplossing.

In mijn web.xml heb ik nu
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  <servlet>
         <servlet-name>Gate</servlet-name>
         <servlet-class>com.fredhopper.SEM.frontend.web.Gate</servlet-class>
         <load-on-startup>1</load-on-startup>
  </servlet>

  <filter>
    <filter-name>GateFilter</filter-name>
    <filter-class>com.fredhopper.SEM.frontend.web.GateFilter</filter-class>
  </filter>

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

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

Het mooie is inderdaad dat de Filter klasse voorrang krijgt van de webcontainer, hierdoor kon ik in de filterclasse kijken of er een alternatieve url als output gegeven moest worden. Dit heb ik opgelost door gewoon direct de file als een stream te forwarden naar de outputstream van de servlet. (Het is gewoon HTML).

Het systeem werkt nu perfect dankzij de goede tips, hulde!

| To acknowledge what is known as known and what is not known as known is knowledge. |


Verwijderd

jAnO! schreef op dinsdag 08 augustus 2006 @ 12:10:
De container pakt altijd de mapping die het exactste matcht.
Is dat zo? ik dacht dat er op chronologische volgorde gematched werd?

  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 14-12-2025

jAnO!

lalalavanillevla

even uit een boek:

Container looks for matches like so:

1. exact match

2 directory match

3 extension match

In case there is more than one directory match the container uses the longest match, the more specific one.

/foor/bar/*

wins over foo/*

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


Verwijderd

jAnO! schreef op dinsdag 08 augustus 2006 @ 12:59:
1. exact match

2 directory match

3 extension match
Verrek, nooit geweten, nooit gebruikt (als in: nooit overlappende paden gebruikt).

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Hm, dit is toch wel /foo/bar/* neem ik aan.

  • jAnO!
  • Registratie: Januari 2002
  • Laatst online: 14-12-2025

jAnO!

lalalavanillevla

hmmm, ja..
ik had zeker honger toen ik foor/bar/* typte..

When some people work at a place for ten years they get ten years of experience, other people work at a place for ten years and get one year of experience ten times.


  • flowerp
  • Registratie: September 2003
  • Laatst online: 04-02 02:01
Verwijderd schreef op dinsdag 08 augustus 2006 @ 12:25:
[...]

Is dat zo? ik dacht dat er op chronologische volgorde gematched werd?
De volgorde van waarin je de filter mappings in web.xml specificeerd is idd belangrijk (als je dat met chronologische volgorde bedoeld). Het bepaald de gehele filter chain voor een resource.

It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult.

Pagina: 1