Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Giving multiple URL patterns to Servlet Filter

I am using a Servlet Filter in my JSF application. I have three groups of Web pages in my application, and I want to check Authentication for these pages in my Servlet Filter:

my Folders

/Admin/ *.xhtml  /Supervisor/*.xhtml /Employee/*.xhtml 

and I am writing web.xml like

<filter>     <filter-name>LoginFilter</filter-name>     <filter-class>com.ems.admin.servlet.LoginFilter</filter-class> </filter>  <filter-mapping>     <filter-name>LoginFilter</filter-name>     <url-pattern>/Employee/*</url-pattern> </filter-mapping> <filter-mapping>     <filter-name>LoginFilter</filter-name>     <url-pattern>/Admin/*</url-pattern> </filter-mapping> <filter-mapping>     <filter-name>LoginFilter</filter-name>     <url-pattern>/Supervisor/*</url-pattern> </filter-mapping> 

but requests like

http://localhost:8080/EMS2/faces/Html/Admin/Upload.xhtml 

are not entering into Filter.

I have to provide security to these 3 folders.

How to solve this problem ?

like image 781
Raju Boddupalli Avatar asked Jul 25 '12 08:07

Raju Boddupalli


People also ask

Can a servlet have multiple URL patterns?

Previous versions of the servlet schema allows only a single url-pattern in a filter mapping. For filters mapped to multiple URLs this results in needless repetition of whole mapping clauses.

Can we have multiple URL pattern in web xml?

Yes that works just fine, but that is Servlet 2.4 style and I am trying to avoid the problem of extra typing. because <url-pattern> element is allowed only once under <filter-mapping> . "Multiple <url-pattern> elements should be fine, but the value /einwenig/*.

Can a filter be attached to one or more servlets?

For mapping filter we can use, either url-pattern or servlet-name. The url-pattern elements has an advantage over servlet-name element i.e. it can be applied on servlet, JSP or HTML.

Can we have multiple filters in web xml?

Yes. You can. The order you placed in web. xml will execute.


2 Answers

If an URL pattern starts with /, then it's relative to the context root. The /Admin/* URL pattern would only match pages on http://localhost:8080/EMS2/Admin/* (assuming that /EMS2 is the context path), but you have them actually on http://localhost:8080/EMS2/faces/Html/Admin/*, so your URL pattern never matches.

You need to prefix your URL patterns with /faces/Html as well like so:

<url-pattern>/faces/Html/Admin/*</url-pattern> 

You can alternatively also just reconfigure your web project structure/configuration so that you can get rid of the /faces/Html path in the URLs so that you can just open the page by for example http://localhost:8080/EMS2/Admin/Upload.xhtml.

Your filter mapping syntax is all fine. However, a simpler way to specify multiple URL patterns is to just use only one <filter-mapping> with multiple <url-pattern> entries:

<filter-mapping>     <filter-name>LoginFilter</filter-name>     <url-pattern>/faces/Html/Employee/*</url-pattern>     <url-pattern>/faces/Html/Admin/*</url-pattern>     <url-pattern>/faces/Html/Supervisor/*</url-pattern> </filter-mapping> 
like image 121
BalusC Avatar answered Sep 26 '22 04:09

BalusC


In case you are using the annotation method for filter definition (as opposed to defining them in the web.xml), you can do so by just putting an array of mappings in the @WebFilter annotation:

/**  * Filter implementation class LoginFilter  */ @WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"}) public class LoginFilter implements Filter {     ... 

And just as an FYI, this same thing works for servlets using the servlet annotation too:

/**  * Servlet implementation class LoginServlet  */ @WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"}) public class LoginServlet extends HttpServlet {     ... 
like image 41
Michael Plautz Avatar answered Sep 23 '22 04:09

Michael Plautz