我已經閱讀了很多例子,雖然我似乎有一個'確切'的副本,所以我不知道爲什麼我的過濾器將執行時,我導航到/login
而不是/restricted/*
。 我已經嘗試了兩個註釋(如下例所示)和XML來定義WebFilter。WebFilter urlPatterns ignored
web過濾
@WebFilter(filterName = "AuthenticationFilter", servletNames = { "Faces Servlet" }, urlPatterns = { "/restricted/*" })
public class AuthenticationFilter implements Filter {
@Inject
private SessionManager sessionManager;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Active AuthenticationFilter");
if (sessionManager.getUser() == null) {
((HttpServletResponse) response).sendRedirect("/login");
}
else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
的web.xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Pretty Filter</filter-name>
<filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>Pretty Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>AuthenticationFilter</filter-name>
<filter-class>filter.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/restricted/*</url-pattern>
</filter-mapping>
注意
即使過濾器在這兩個文件中定義的,我可以保證我不是同時使用兩種符號。爲了測試和審查,我將它們都發布了。
我是新來的使用webfilters,並找不到多使用多個過濾器。但是我讀過的,你可以使用多個,他們將按照你在web.xml
中定義的順序執行。
問題
有沒有人有一個線索,爲什麼我的過濾器將網頁上的作爲/login
過於執行? 該應用程序在Glassfish 3.1.2上運行。
好的,我會試試看。我的確希望這個「和」的情況,因爲我看到了很多例子,其中定義了一個servlet名稱。我會在測試後報告我的發現。 – Aquillo
過濾器也可以完美地映射到特定的servlet。這通常更簡單,因爲單個servlet可能會映射到多個URL模式(例如,某些webapps在'/ faces/*','* .faces'和'* .jsf'上映射'FacesServlet';這會很乏味在過濾器映射中重複這些模式)。 – BalusC
說實話。我並沒有想過要試驗Servlet。但我到了那裏,很快就會遇到另一個挑戰。回到主題,你的解決方案的工作原理,我似乎以前工作過,但我誤解了另一個錯誤(我漂亮的過濾器重定向'/帳戶'爲'/ restricted/account',所以預計擊中'/ restricted/*'因爲這個過濾器出現在Pretty Filter之後,但是這是由於是相同的請求,不是嗎?)。 – Aquillo