Java学习日记3(过滤器)

过滤器

访问Servlet之前和之后,可以增加一些我们的业务程序,就是过滤器。
执行顺序:

过滤器Filter

如何实现Filter:

  1. 编写Filter类实现javax.servlet.Filter接口
  2. 配置Filter过滤哪些Servlet

在xml配置中,哪个Filter配置在前面就先执行哪个
Xml配置:

 <filter>
     <filter-name>logger</filter-name>
     <filter-class>com.oracle.LoggerFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>logger</filter-name>
      <url-pattern>/admin/*</url-pattern>//意思是过滤admin文件夹下所有的页面
  </filter-mapping>

也可以用Annotation配置,不过xml可以保证Filter的顺序。

@WebFilter("/admin/*")

一个简单的Filter:

package com.oracle;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstFilter implements Filter {

    FilterConfig fc;
    @Override
    public void destroy() 
    {
        System.out.println("FirstFilter......destroy...........");

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {
        System.out.println("FirstFilter......dofilter...........");

        System.out.println("执行目标Servlet之前。。。。。。。。。。。。。。。。。");

        arg2.doFilter(arg0, arg1);//把当前请求响应交给下一个目标,这里执行下一个Filter或者是目标Servlet。

        System.out.println("执行目标Servlet之后。。。。。。。。。。。。。。。。。。");

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        System.out.println("FirstFilter......init...........");
    this.fc=arg0;

    }

}

再写另一个过滤器。。

package com.oracle;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
//@WebFilter("/admin/*")
public class LoggerFilter implements Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException 
    {
        System.out.println("Logger....前日志。。。。。。。");
        arg2.doFilter(arg0, arg1);

        System.out.println("Logger....后日志...........");

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

在控制台的显示:

Logger....前日志。。。。。。。
FirstFilter......dofilter...........
执行目标Servlet之前。。。。。。。。。。。。。。。。。
HelloServlet.....service......
执行目标Servlet之后。。。。。。。。。。。。。。。。。。
Logger....后日志...........

如果想重写Request和Response中的方法,那么就可以继承以下4个包装类:

  • ServletRequestWrapper
  • ServletResponseWrapper
  • HttpServletRequestWrapper
  • HttpServletResponseWrapper

用过滤器我们可以实现:

  • 过滤IP
  • 图片防外链(只能从自己的网站上看到正确图片,从别的网站请求看到的是不同的图片)
  • 重写一个好看的404页面,对用户友善一些

这里就这些啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值