Filter过滤器

filter简介:

             是在服务器中的一个web组件,他可以过滤客户端和web资源之间的请求和响应信息。

作用:   

        检查用户访问权限

        设置请求响应编码,解决乱码问题

声明周期:

      filter的声明周期大致和servlet一致,只不过实现了filter类的那个类的实例化在servlet之前。

  1. 先执行Filter的构造方法

  2. 然后执行Filter的init()方法,对象创建后,马上就被调用,对Filter做一些初始化操作

  3. 执行Filter的doFilter()方法,每次访问目标资源,只要匹配过滤的地址,就会调用。

  4. 执行Filter的destroy()方法,服务器停止时调用,用来释放资源。

应用   实现filter接口:

@WebFilter("/*")//是以一个注解,大致意思是,在所有路径加都要进入这个过滤器,(路径问题看后面)

当然也可以在web.xml中配置(放在了这两段代码后)

package com.thekingqj.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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class SetCharFilter
 */
@WebFilter("/*")
public class SetCharFilter extends HttpFilter {

	@Override
	public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
        chain.doFilter(request, response);//必须要有这个方法,不然过滤器不会放开往后执行
        //不带用这个chain.doFilter方法会阻止用户继续向下访问
	}

    
}

下面这个相当于HTTPServlet类中的实现方式

package com.thekingqj.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class HttpServlet
 */

public abstract class HttpFilter implements Filter {
	private FilterConfig filterConfig;


    public FilterConfig getFilterConfig() {
		return filterConfig;
	}
    
      

	public ServletContext getServletContext() {
		return filterConfig.getServletContext();
	}




    public HttpFilter() {
    }

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req=(HttpServletRequest)request;
		HttpServletResponse res=(HttpServletResponse)response;
		doFilter(req, res, chain);
	}
	
	
	public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException; 

	public void init(FilterConfig fConfig) throws ServletException {
		filterConfig=fConfig;
	}

}
	<filter>
		<!-- 给SetCharFilter起一个名字 -->
		<filter-name>SetCharFilter</filter-name>
		<!-- 是哪一个Filter类 -->
		<filter-class>com.thekingqj.filter.SetCharFilter</filter-class>
	</filter>
        <filter-mapping>
		<filter-name>SetCharFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

filter的拦截路径的设置:

  • 第一种:通过filter-mapping的url-pattern来配置(与Servlet的url-pattern的规则相同)

    • 精确匹配:/路径/资源名

      比如:/index.html、/hello/index.jsp 、 /client/LoginServlet 等,只要在请求地址完全一样时才会调用Filter

    • 目录匹配:/路径名/*

      比如1:/abc/* 表示可以拦截abc目录下的所有资源,甚至是abc目录下的其他目录。其中:/* 表示访问 当前工程下所有资源

      比如2:/* 表示只要访问项目根目录下的资源就会调用Filter

    • 后缀名匹配:*.后缀名

      比如:*.jsp 表示拦截所有后缀为jsp文件资源

  • 第二种:通过filter-mapping中的servlet-name来指定要过滤的Servlet

    • 在项目中有一个Filter加做HelloFilter,一个Servlet叫做HelloServlet。在Filter的filter-mapping中增加了一个servlet-name标签,将该标签的值设置成Servlet的名字,在访问Servlet时就会调用该过滤器过滤请求。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值