注解@WebFilter的使用


filter過濾器,@WebFilter可用於將某個類設置為過濾器,該注解在tomcat的servlet包下,從servlet3.0版本就開始支持這個注解了。

 該注解包含如下參數可以設置:

 

屬性名 類型 說      明                 其他
description
String 對該注解的說明  
displayName
String 過濾器顯示名,等同與<display-name>  
initParams
WebInitParam[]

用於設置該過濾器類的一些初始化參數,

等同於<init-param>

如:initParams = {@WebInitParam(name = "ignoredUrl",
value = ".css#.js#.jpg#.png#.gif#.ico")
filterName
String 過濾器名,等價與<filter-name>  
servletNames
String[]

String類型的數組,用於指定過濾的servlet。

取值是 @WebServlet 中的 name 屬性的取值,

或者是 web.xml 中 <servlet-name> 的取值。

 

   value,

urlPatterns

String[]

過濾器的 URL 匹配模式。

等價於 <url-pattern> 標簽。

如: urlPatterns = {"/*"} 攔截所有,

需要注意value和urlpattern只能選一個,建議urlpattern,好看些

dispatcherTypes DispatcherType[]

過濾器的轉發模式。具體取值包括:

ASYNC、ERROR、FORWARD、

INCLUDE、REQUEST。

有默認值,見上圖,默認為request
asyncSupported boolean

過濾器是否支持異步操作模式,

等價於 <async-supported> 標簽。

默認為false
       

 

 

 

 

 

 

 

 

 

 

 

 

還有就是,被@WebFilter注解的類,會在容器啟動時被加載,並進行屬性配置。即項目一啟動容器自動加載init方法。

可以看到,項目啟動后進入到filter的init方法里面了

 

 

 

 先看一下filterconfig:

 

 

 

 

 

 可以看到在filterDef中有我們之前提到的注解里面的所有內容。

當filter的init方法執行完畢后就注冊完畢了,進入類:org.apache.catalina.core.ApplicationFilterConfig,方法:initFilter。

@WebFilter(filterName = "DabaiLoginFilter", urlPatterns = {"/*"}, initParams = {@WebInitParam(name = "ignoredUrl", value = ".css#.js#.jpg#.png#.gif#.ico"), @WebInitParam(name = "filterPath", value = "/user/login#/user/registerUser")}) public class DabaiLoginFilter implements Filter { private static final String FILTER_PATH = "filterPath"; private static final String IGNORED_PATH = "ignoredUrl"; private static final List<String> ignoredList = new ArrayList<>(); private String[] allowUrls; private String[] ignoredUrls; @Override public void init(FilterConfig filterConfig) throws ServletException { String filterPath = filterConfig.getInitParameter(FILTER_PATH); if (!StringUtils.isEmpty(filterPath)) allowUrls = filterPath.contains("#") ? filterPath.split("#") : new String[]{filterPath}; String ignoredPath = filterConfig.getInitParameter(IGNORED_PATH); if (!StringUtils.isEmpty(ignoredPath)) { ignoredUrls = ignoredPath.contains("#") ? ignoredPath.split("#") : new String[]{ignoredPath}; for (String ignoredUrl : ignoredUrls) { ignoredList.add(ignoredUrl); } } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest servletRequest = (HttpServletRequest) request; HttpServletResponse servletResponse = (HttpServletResponse) response; String requestUrl = servletRequest.getRequestURI();/*具體,比如:處理若用戶未登錄,則跳轉到登錄頁 Object userInfo = servletRequest.getSession().getAttribute("user"); if(userInfo!=null) { 如果已登錄,不阻止 chain.doFilter(request, response); return; } if (requestUrl != null && (requestUrl.contains("/login.html") || requestUrl.contains("/register.html"))) */ { chain.doFilter(request, response); return; } if (verify(ignoredList, requestUrl)) { chain.doFilter(servletRequest, response); return; } if (null != allowUrls && allowUrls.length > 0) { for (String url : allowUrls) { if (requestUrl.startsWith(url)) { chain.doFilter(request, response); return; } } } servletResponse.sendRedirect("/login.html"); } private static String regexPrefix = "^.*"; private static String regexSuffix = ".*$"; private static boolean verify(List<String> ignoredList, String url) { for (String regex : ignoredList) { Pattern pattern = Pattern.compile(regexPrefix + regex + regexSuffix); Matcher matcher = pattern.matcher(url); if (matcher.matches()) { return true; } } return false; } @Override public void destroy() { } }

 

  

urlPatterns


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM