Java Web过滤器

Java Web过滤器:

定义:

是一个服务器端的组件,它可以截取用户端请求与响应信息,并对这些信息过滤

生命周期:

  1. 实例化: Web.xml 启动服务器阶段
  2. 初始化: init()
  3. 过滤: doFilter()
  4. 销毁: destory() web容器关闭时

步骤:

  1. 创建一个类实现java.servlet.Filter接口

  2. 在web.xml中注册过滤器

过滤方法:

init():初始化,Web容器创建过滤器实例后调用,可以读取web.xml过滤器参数

doFilter():当用户请求访问与过滤器关联的URL时,Web容器将调用过滤器的doFilter方法

destory():web容器关闭时,释放过滤器占用的资源

Web.xml配置:

<filter>
    <filter-name>Filter名称</filter-name>
    <filter-class>Filter的类名称</filter-class>
    <init-param>
        <description>描述信息(可以省略)</description>
        <param-name>参数名称</param-name>
        <param-value>参数值</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>Filter名称(同Fileter配置下的名称)</filter-name>
    <url-pattern>URL</url-pattern>
    <dispatcher></dispatcher>//过滤类型[见后面]
<filter-mapping>

忽视过滤页面的方法:

  1. 在web.xml中配置FilterConfig,设置一个参数,参数值为要忽视过滤的页面,以某种符号隔开
  2. 在过滤器类init()方法中获取FilterConfig对象传递给该类的一个私有属性
  3. doFilter中获取该私有属性的过滤参数,对参数值分割处理
  4. 将ServletRequest对象强制转换成HttpServletRequest,判断request.getRequestURL()中是否包含该忽视地址,(可以使用String.indexOf(String)方法)
  5. 如果包含,则让过滤器链执行doFilter(request,response)并return空,放行

    如下:过滤所有地址<url-pattern>/*</url-pattern>
    但是忽略访问login.jsp和LoginServlet的页面

public class MyFilter implements Filter {

    private String toignore="";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("initMyFilter");
        toignore=filterConfig.getInitParameter("toignore");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("Start……MydoFilter");
        String[] ignore=toignore.split(",");
        HttpServletRequest request2=(HttpServletRequest)request;
        String rString=request2.getRequestURI();
        boolean isignore=false;
        for (String string : ignore) {
            if(rString.indexOf(string)!=-1){//如果url中包含
                isignore=true;
                break;
            }
        }

        if(isignore){
            System.out.println("忽略过滤");
            chain.doFilter(request, response);//传递给下一个Filter
        }else if(request2.getSession().getAttribute("username")!=null){
            //过滤器具体功能是实现,省略……
            chain.doFilter(request, response);
            //对返回servlet执行返回的结果过滤,省略……
        }else {
            //如果Session中没有username,则重定向到login.jsp
            HttpServletResponse response2=(HttpServletResponse)response;
            response2.sendRedirect("login.jsp");
        }
        System.out.println("end……MydoFilter");

    }

    @Override
    public void destroy() {
        System.out.println("destory……MyFilter");
    }
}
<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>filter.MyFilter</filter-class>
    <init-param>
        <description>request的url中包含这些字符则忽略过滤</description>
        <param-name>toignore</param-name>
        <param-value>login.jsp,LoginServlet</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

过滤器链:

当请求的url匹配多个过滤器时,服务器会按照web.xml中过滤器定义的先后顺序组装成一条链
过滤器链的执行顺序

过滤类别

servlet 2.5版本过滤器分类:

Request(默认):用户直接访问页面时,Web容器将会调用过滤器
forword:目标资源是通过RequestDispatcher的forward访问时,该过滤器会被调用
include:目标资源是通过RequestDispatcher的include方法调用时,过滤器将被调用
error:目标资源通过声明式异常处理机制调用时,过滤器将会被调用

servlet 3.0版本增加分类:

async:支持异步处理
在过滤器类的上面添加注解:(或者在web.xml中配置)
@WebFilter(servletNames={“”},filterName=”“)
public class …… implements Filter{……}
在web.xml中配置error提示页面:

<error-page>
    <error-code>错误代码</error-code>
    <location>错误页面url</location>
</error-page>

Java Web监听器的基本创建http://blog.csdn.net/u014438534/article/details/54427329
完整示例:https://github.com/lazyboy20150303/Model2Demo/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值