Filter(过滤器)


Servlet的三大组件之一。如果配置过滤器,那么当请求某一个Servlet的时候,先会进入到过滤器中。只有过滤器执行了放行操作的时候,才会继续请求目标的Servlet。

配置Filter

定义一个类,继承Filter,重写doFilter方法。

package com.chinasofti.day11.filter;

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 MyFilter implements Filter {
	
	// 创建过滤器时候自动调用。容器启动的时候创建过滤器。
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("执行MyFilter的init方法..");
	}

	// 每次请求Servlet时候,如果配置了过滤器,每次请求都会执行该方法
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("执行MyFilter的doFilter方法...");
		
	}

	// 过滤器被销毁时候自动执行
	@Override
	public void destroy() {
		System.out.println("执行MyFilter的destroy方法...");
	}

}

第二步:在web.xml中配置过滤器。

<!-- 配置过滤器 -->
<filter>
 	<!-- 过滤器的名字 -->
  	<filter-name>MyFilter</filter-name>
  	<!-- 过滤器的完整类名 -->
  	<filter-class>com.chinasofti.day11.filter.MyFilter</filter-class>
</filter>
  
<filter-mapping>
  	<filter-name>MyFilter</filter-name>
  	<url-pattern>/hello</url-pattern>
</filter-mapping>

上面url-pattern配置过滤器的路径。当用户请求/hello的时候,首先会进入到MyFilter过滤器中。只有当过滤器执行了放行操作的时候,才会执行目标Servlet。

过滤路径的写法与Servlet相同。

FilterConfig

该对象用于获取Filter的配置参数。例如:

@Override
public void init(FilterConfig filterConfig) throws ServletException {
	System.out.println("执行MyFilter的init方法..");
	// 获取过滤器的配置参数
	name = filterConfig.getInitParameter("name");
}

我们可以在filter节点中指定配置参数:

<!-- 配置参数 -->
<init-param>
	<param-name>name</param-name>
	<param-value>jacky</param-value>
</init-param>

过滤器链

如果在同一个资源上配置了多个过滤器,那么访问资源的时候,就会按照下面顺序执行过滤器中的代码:

先配置的过滤器就会先启动,然后再执行放行,最后按照配置顺序的相反方向执行放行后的代码。比如有两个Filter,一个FilterA,另外一个FilterB。FilterA先配置,所以执行顺序是:

  • 执行FilterA放行前代码;
  • 执行FilterA放行代码;
  • 执行FilterB放行前代码;
  • 执行FilterB放行代码;
  • 执行目标Servlet;
  • 执行FilterB放行后代码;
  • 执行FilterA放行后代码;

零配置(注解)

作用:@WebFilter配置过滤器。

@WebFilter注解的属性:

  • value:配置url-pattern。如果只有一个value属性,可以不写value属性名。
  • urlPatterns:同上,不能够与value共存。
  • servletNames:指定要拦截的Servlet的name属性。
  • initParams: 指定servlet配置参数。它是一个数组,数组元素是@WebInitParam类型。

@WebInitParam: 指定一个配置参数,它有两个属性:

  • name:参数名
  • value:参数值
@WebFilter(filterName = "HelloFilter",urlPatterns = "/*")
public class HelloFilter 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;
        //获取session
        HttpSession session = ((HttpServletRequest)servletRequest).getSession();
        //获取Session的name属性
        String name = (String)session.getAttribute("name");

        //获取请求路径
        String url = request.getRequestURL().toString();
        int index = url.lastIndexOf("/");
        url = url.substring(index);
        //判断条件,满足则跳转页面
        if(session.getAttribute("name")!=null||url.equals("/Hello")||url.equals("/")){
            System.out.println("不进行拦截");
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            System.out.println("满足拦截条件,进行拦截!");
        }
    }

    @Override
    public void destroy() {

    }
}

应用场景

1)登录认证

2)项目全局中文乱码处理

3)七天免登陆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值