Filter

Filter

Servlet, Filter, Listener称为Java Web的三大组件

 

Filter: 过滤器

         当浏览器访问服务器资源时和响应返回时,过滤器可以将请求拦截下来,完成一些特殊功能

用途: 一般用于完成通用操作:如登录验证,统一编码处理,敏感字符过滤…

 

1. Filter实现

  1. 定义一个类,实现Filter接口
  2. 覆写方法
  3. 配置拦截路径
    1. 配置WEB-INF中的xml 

    2. 用注解配置路径:@WebFilter(urlPatterns=””)或@WebFilter(value=””)或@WebFilter(””)

2. Filter原理

  1. Filter执行流程
    1. 请求过滤:执行放行doFilter上的代码
    2. 放行:执行doFilter,拦截的资源被执行
    3. 响应过滤:拦截的资源做出响应后,回来执行doFilter下边的代码

 

  1. Filter生命周期
    1. init():初始化

      在服务器启动后,创建Filter对象,执行init方法。

      只执行一次。一般用于加载资源。

    2. doFilter():请求过滤,响应过滤。
    3. destroy():销毁

      在服务器正常关闭时调用,一般用于释放资源

       

  1. 过滤器拦截路径
    1. 拦截资源:/index.jsp, /loginServlet

        只有访问具体资源时,过滤器才会被执行

      2. 拦截目录:/user/*

        只有访问/user下的资源时,过滤器才会被执行

      3. 后缀名拦截:*.jsp (没有/)

      4.  拦截所有资源:/*

 

  1. 过滤器的拦截方式:资源的访问方式
    1. 注解配置:配置dispatcherType属性

- REQUEST: 默认值,资源被浏览器直接访问时,才被拦截

- FORWARD: 转发访问这个资源时,才被拦截

- INCLUDE:包含访问资源时,才被拦截

- ASYNC:异步访问资源时,才被拦截

@WebFilter(dispatcherType={DispatcherType.REQUEST, DispatcherType.FORWARD});

2. xml配置

 

 

 

  1. 拦截链
    1. 执行顺序:请求过滤按先后顺序由小到大执行,响应顺序则正好相反

All filter...           (@WebFilter(/*))

hello Filter...      (@WebFilter(/hello.jsp))

你好,JSP           (hello.jsp)

hello Filter back...

All filter…

 

 

2. 过滤器的先后顺序

* 注解配置:- 按字符串比较规则,由小到大执行。

                   如:/*先于/login.jsp执行

          - 如果有重复,则从小到大覆盖执行

                   如:/* 和 /login.jsp在请求login.js时都执行过滤

* web.xml配置:谁在上,谁先执行

 

  1. 登录案例

           - 访问案例的资源。验证其是否登录

           - 如果登录了,则直接放行。

           - 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。

 

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig config) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request1=(HttpServletRequest) request;

        String uri=request1.getRequestURI();
        //注意:要过滤资源,否则样式和字体等login的资源不显示
        if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/fonts/") || uri.contains("/js/") || uri.contains("/checkCodeServlet"))
        {
            chain.doFilter(request, response);
        } else {
            String userName= (String) request1.getSession().getAttribute("username");
            if(null != userName && !"".equals(userName))
            {
                chain.doFilter(request, response);
            }else {
                request.setAttribute("loginMsg","您未登录,请登录!");
                request.getRequestDispatcher("/hellouser/login.jsp").forward(request, response);
            }
        }

    }
}

 

posted @ 2021-12-09 22:12  言思宁  阅读(330)  评论(0编辑  收藏  举报