J2EE URL rewrite

To mod_rewrite module του Apache web server πιθανόν το ξέρετε. Πόσες νύχτες έχουν κάποιοι από εμάς ξοδέψει για να το configure-άρουμε ξεσκαρτίζοντας ως και τα ποιο απίθανα forum (από Κορέα μέχρι Αργεντινή) για να χρησιμοποιήσουμε τις απεριόριστες δυνατότητες που έχει ως προς την επαναεγγραφή του URL on the fly στη δική μας περίπτωση.

Να όμως που υπάρχει και έκδοση του URL rewrite σε επίπεδο web application. Η συγκεκριμένη τεχνολογία λέγεται Url Rewriter Filter, ένα ελέυθερα διαθέσιμο προϊόν της Tuckey. Σε αυτό το άρθρο περιγράφω κάποια χαρακτηριστικά και κάποιες πρακτικές οδηγίες χρήσεως.

 

ΠΕΡΙΓΡΑΦΗ

Το URL Rewrite Filter δίνει τη δυνατότητα να μεταβληθεί το request URL πριν φτάσει στον κώδικα της εφαμοργής μας. Με τη συγκεκριμένη τεχνική μπορούμε να ενισχύσουμε κάποιες επιμέρους λειτουργίες της εφαρμογής μας όπως για παράδειγμα:

1) Διαχείρηση του URL που φαίνεται στον χρήστη. Μπορεί να θέλουμε να μη γνωρίζουν οι χρήστες τη τεχνολογία που χρησιμοποιούμε και έτσι να αποκρύπτουμε τα extensions των σελίδων (πχ αντί για /servlets/helloworld.jsp να φαίνεται /helloworld). Ή επίσης υπάρχει περίπτωση να θέλουμε να υπάρχει ένα URL από το οποίο να έχει κάποια πληροφορία για τους χρήστες (πχ myblog.com/showblog/20100401.jsp σε myblog.com/dated/01.Apr.2010.jsp)

2) Μεταβολή URL βάση της ώρα/ημερομηνίας. Χρήσιμο σε πολλές περιπτώσει όπως για παράδειγμα αν μετά τις 10 το βράδυ που μπορεί να κλείνει μία υπηρεσία της εφαρμογής, οι χρήστες να γίνονται redirected σε κάποιο άλλο URL.

3) Ανίχνευση του φυλλομετρητή. Μας επιτρέπει να μεταβάλουμε το URL του request βάσει του browser που χρησιμοποιείται (μέσω πχ του στοιχείου user-agent) από τον χρηστη έτσι ώστε για παράδειγμα να διαχειρίζεται το κατάλληλο servlet την κλήση που έχει τον προσαρμοσμένο κώδικα javascript για τον συγκεκριμένο browser.

Όσων αφορά το τεχνικό κομμάτι, για να χρησιμοποιήσετε το URL Rewrite Filter απαιτείται:

  • η Βιβλιοθήκη urlrewritefilter.jar. Maven dependency:

[xml]
<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
<version>3.1.0</version>
</dependency>
[/xml]

  • Προσθήκη στο web.xml του παρακάτω:

[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>
<!– All url will be filtered –>
<url-pattern>/*</url-pattern>
</filter-mapping>
[/xml]

  • Αρχείο WEB-INF/urlrewrite.xml. Στο αρχείο αυτό γίνεται όλη η παραμετροποίηση για το URL rewriting.

ΠΑΡΑΔΕΙΓΜΑΤΑ ΠΑΡΑΜΕΤΡΟΠΟΙΗΣΗΣ

Το urlrewrite.xml είναι ένα απλό xml αρχείο. Για αναλυτικές οδηγίες σύνταξης του ανατρέξτε στο documentation της εφαρμογής. Παρακάτω κάποια χρήσιμα παραδείγματα

  • Προώθηση σε άλλο url όταν το url ταιρίαζει σε κάποιο pattern

[xml]
<rule>
<from>^/$</from>
<to type="redirect">/opencms/opencms/index.html</to>
</rule>
[/xml]

  • Μορφοποίηση url όταν το url ταιρίαζει σε κάποιο pattern

[xml]
<rule>
<from>/</from>
<to>/main/welcome</to>
</rule>
[/xml]

  • Εσωτερική μεταφορά σε άλλο url. Αν κάποιο κομμάτι του URL έχει νόημα για τον κώδικά μας αλλά θέλουμε να φαίνεται μόνο εσωρερικά στην εφαρμογή, αυτό επιτυγχάνεται με το παρακάτω. Παρατηρήστε ότι μπορώ να χρησιμοποίησω wildcards αντί για το τυπικό syntax του mod_rewrite:

[xml]
<urlrewrite default-match-type="wildcard">
<! add to all the prefix /pages –>
<rule>
<from>/**</from>
<to>/pages/$1</to>
</rule>
<! what you show to browser should be the url without the prefix /pages –>
<outbound-rule>
<from>/pages/**</from>
<to>/$1</to>
</outbound-rule>
</urlrewrite>
[/xml]

  • Redirect μόνο κάτω από ορισμένες συνθήκες:

[xml]
<rule>
<name>Domain Name Check</name>
<condition name="host" operator="notequal">www.example.com</condition>
<from>(.*)</from>
<to type="redirect">http://www.example.com/context$1</to>
</rule>
[/xml]

ΠΑΡΑΠΟΜΠΕΣ

Passionate Archer, Runner, Linux lover and JAVA Geek! That's about everything! Alexius Dionysius Diakogiannis is a Senior Java Solutions Architect and Squad Lead at the European Investment Bank. He has over 20 years of experience in Java/JEE development, with a strong focus on enterprise architecture, security and performance optimization. He is proficient in a wide range of technologies, including Spring, Hibernate and JakartaEE. Alexius is a certified Scrum Master and is passionate about agile development. He is also an experienced trainer and speaker, and has given presentations at a number of conferences and meetups. In his current role, Alexius is responsible for leading a team of developers in the development of mission-critical applications. He is also responsible for designing and implementing the architecture for these applications, focusing on performance optimization and security.