web-gelistirme-sc.com

Servlet Filtresi'ne birden fazla URL modeli vermek

JSF uygulamamda bir Servlet Filtresi kullanıyorum. Uygulamamda üç grup Web sayfam var ve bu sayfalar için Kimlik Doğrulama'yı Servlet Filtrem'de kontrol etmek istiyorum:

klasörlerim

/Admin/ *.xhtml

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

ve web.xml like yazıyorum

<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>

ama gibi istekleri

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

filtreye girmiyorsunuz.

Bu 3 klasöre güvenlik sağlamak zorundayım.

Bu problem nasıl çözülür?

69
Raju Boddupalli

Bir URL deseni / ile başlıyorsa, içerik köküne göre değişir. /Admin/* URL modeli yalnızca http://localhost:8080/EMS2/Admin/* sayfasındaki sayfalarla eşleşir (/EMS2 içeriğinin yol olduğunu varsayarsak), ancak bunları aslında http://localhost:8080/EMS2/faces/Html/Admin/* üzerinde bulundurursunuz, böylece URL modeliniz asla eşleşmez.

URL modellerinizi /faces/Html ile öneklemeniz gerekir:

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

Alternatif olarak, web proje yapınızı/yapılandırmanızı da yeniden yapılandırabilirsiniz, böylece URL'lerde /faces/Html yolundan kurtulabilirsiniz, böylece örneğin sadece http://localhost:8080/EMS2/Admin/Upload.xhtml sayfasını açabilirsiniz.

Filtre eşleme sözdiziminiz gayet iyi. Ancak, birden fazla URL modeli belirtmenin daha basit bir yolu, yalnızca birden fazla <filter-mapping> girişiyle yalnızca bir <url-pattern> kullanmaktır:

<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>
122
BalusC

Filtre tanımlaması için açıklama yöntemini kullanıyorsanız (_web.xml_ içinde tanımlamanın aksine), _@WebFilter_ ek açıklamalarına sadece bir dizi eşleme koyarak yapabilirsiniz:

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

Ve aynen bir FYI olarak, bu aynı şey, sunucu uygulaması ek açıklamasını kullanan sunucu uygulayıcıları için de geçerlidir:

_/**
 * Servlet implementation class LoginServlet
 */
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginServlet extends HttpServlet {
    ...
_
15
Michael Plautz