注解@WebFilter的使用

filter过滤器,SpringBoot中@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 = "LogCostFilter", urlPatterns = {"/*"},
        initParams = {@WebInitParam(name = "ignoredUrl", value = ".css#.js#.jpg#.png#.gif#.ico"),
                      @WebInitParam(name = "filterPath",
                              value = "/user/login#/user/registerUser")})
public class LogCostFilter 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

猜你喜欢

转载自www.cnblogs.com/notably/p/12361072.html