过滤器(Filter)

过滤器的作用

  • 执行地位在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时,会根据执行流程再次反向执行Filter

  • 可以解决多个Servlet共性代码的冗余问题(例如:乱码处理、登录验

编写过滤器

Servlet API中提供了一个Filter接口,开发人员编写一个Java类实现了这个接口即可,这个Java类称之为过滤器(Filter)

 Filter过滤器的配置方法

1.web.xml配置

<filter>
        <filter-name>aaFilter</filter-name>
        <filter-class>com.qianfeng.filter.AAFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>aaFilter</filter-name>
        <url-pattern>/aa</url-pattern>
    </filter-mapping>

    <!--配合和注解两种形式去配置过滤器
    web.xml配置是优先于注解执行的  在web.xml中 按照顺序 先配置的先执行
    注解中  按照过滤器类名的自然顺序执行
    -->

  <!--配合和注解两种形式去配置过滤器
    web.xml配置是优先于注解执行的  在web.xml中 按照顺序 先配置的先执行
    注解中  按照过滤器类名的自然顺序执行
    -->

2.注解配置 :WebFilter("/aa")

Filter实现过程

@WebFilter("/aa")
public class AAFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("前置过滤");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("后置过滤");
        
    }

    @Override
    public void destroy() {

    }
}
@WebServlet("/aa")
public class AAServlet extends HttpServlet {


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet执行了");
    }
}

Servlet和Filter的配置路径必须一样,上图执行顺序,前置过滤--servlet执行了--后置过滤。

Filter登录验证原理

//@WebFilter(urlPatterns = {"/bb","/cc","/dd"})
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        HttpServletResponse response=(HttpServletResponse)servletResponse;
        HttpSession session = request.getSession();

        Object user = session.getAttribute("user");
        if(user!=null){//已经登陆了
                filterChain.doFilter(servletRequest,servletResponse);
        }else{
            response.sendRedirect("login.html");
        }

    }

    @Override
    public void destroy() {

    }
}

 @WebFilter(urlPatterns = {"/bb","/cc","/dd"})表示可以过滤多个请求。
 

 过滤器的过滤路径的三种形式

过滤器的过滤路径通常有三种形式:

精确过滤匹配 ,比如/index.jsp   /myservlet1

后缀过滤匹配,比如*.jsp、*.html、*.jpg

通配符过滤匹配/*,表示拦截所有。注意过滤器不能使用/匹配。
    /aaa/bbb/* 允许

过滤器优先级

 

在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。 优先级:

  • 如果为注解的话,是按照类全名称的字符串顺序决定作用顺序

  • 如果web.xml,按照 filter-mapping注册顺序,从上往下

  • web.xml配置高于注解方式

  • 如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值