zoukankan      html  css  js  c++  java
  • 注解@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

  • 相关阅读:
    java web前端发送请求的4种方式
    简单的jQuery前端验证码校验
    验证码实现原理
    Objective-C的内存管理(一)黄金法则的理解
    UIview层次管理
    IOS设置图片背景
    Google Code Jam 2014 Round 1 A:Problem C. Proper Shuffle
    Google Code Jam 2014 Round 1 A:Problem B. Full Binary Tree
    Google Code Jam 2014 Round 1 A:Problem A Charging Chaos
    UVA 10209
  • 原文地址:https://www.cnblogs.com/notably/p/12361072.html
Copyright © 2011-2022 走看看