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 ?
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.
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/*.
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.
Yes. You can. The order you placed in web. xml will execute.
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>
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 { ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With