45-javaweb过滤器



javaweb过滤器

我们首先再来复习一下javaweb三大组件
1.Servlet
2.Listener
3.Filter

这三大组件都是需要在web.xml中进行声明进行配置的




那么,什么是过滤器
过滤器会在一组资源,比如jsp,servlet,css文件,html文件的前面执行
可以让请求达到目标资源,也可以不让请求达到目标资源
所以
1.过滤器有拦截请求的能力
2.其实servlet也可以拦截来自某些ip的访问,但是过滤器可以
统一对一组资源进行操作拦截,而servlet只是针对自己本身的


我们来创建一个Filter试一下

public class AFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

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

    @Override
    public void destroy() {

    }
}

又是似曾相识的4个方法
1.init
2.doFilter
3.destroy

所以很明显
1.init 		创建之后马上执行,用来初始化
2.doFilter	每次过滤的时候都会执行
3.destroy	销毁之前执行,用来做对非内存资源进行释放

OK,那么Filter是什么创建,什么时候销毁的呢
Filter是在服务器启动时就会创建,在服务器关闭的时候销毁
Filter是单例的


刚才说了,三大组件都要在web.xml里面进行配置
那么我们现在来配置一下


    <filter>
        <filter-name>aFilter</filter-name>
        <filter-class>filter.AFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>aFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

filter-name和filter-class我就不说了,
为什么要来一个/*呢
这里的意思就是拦截所有的文件
如果是/web/*
那么就是拦截所有web路径下的文件
如果是/AServlet
那么就是只拦截AServlet




我们来尝试一下拦截
先来一个AServlet

public class AServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("AServlet---doPost");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("AServlet---doGet");
    }
}

然后再来一个Filter

public class AFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter-init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter-doFilter");
    }

    @Override
    public void destroy() {
        System.out.println("filter-destroy");
    }
}

然后配置一下filter

    <filter>
        <filter-name>aFilter</filter-name>
        <filter-class>filter.AFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>aFilter</filter-name>
        <url-pattern>/servlet/AServlet</url-pattern>
    </filter-mapping>

我们配置url为/servlet/AServlet
那么意思就是只拦截AServlet
然后我们试一下访问AServlet
看一下会发生什么


我们发现只输出了
filter-init
filter-doFilter
并没有输出AServlet,那么就说明已经成功拦截了

我们看一下doFilter方法的参数,一个request,一个response,还有一个filterChain
这个filterChain可以调用doFilter方法,可以放行
也就是释放拦截

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter-doFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值