Filter过滤器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZJ_2420441444/article/details/79954568

Filter过滤器的简介

Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。(简言之:filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理)

Filter的功能

在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

Filter链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

Filter并发两步走

编写java类实现Filter接口,并实现其doFilter方法。
在web.xml文件中对编写的filter类进行注册,并设置它所能拦截的资源。

dispatcher:访问的方式(了解)
   REQUEST:默认值,代表直接访问某个资源时执行filter
   FORWARD:转发时才执行filter
   INCLUDE: 包含资源时执行filter
   ERROR:发生错误时 进行跳转是执行filter

Filter的生命周期

1、Filter的创建
  Filter的创建和销毁由web服务器负责。 web应用程序启动时,web服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化
功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前
filter配置信息的FilterConfig对象。
2、Filter的销毁
  web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。
3、FilterConfig接口
  用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了
filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
  String getFilterName():得到filter的名称。
  String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  public ServletContext getServletContext():返回Servlet上下文对象的引用。

简言之:

Filter何时创建:服务器启动时就创建该filter对象

Filter何时销毁:服务器关闭时filter销毁

 Filter的访问流程图


Spring框架下,过滤器的配置

防止中文乱码过滤器项目使用spring框架时。当前台JSP页面和Java代码中使用了不同的字符集进行编码的时候就会出现表单提交的数据或者上传/下载中文名称文件出现乱码的问题,那就可以使用这个过滤器。

<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name><!--用来指定一个具体的字符集-->
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name><!--true:无论request是否指定了字符集,都是用encoding;false:如果request已指定一个字符集,则不使用encoding-->
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Filter的使用案例

使用Filter验证用户登录安全控制。

SessionCheckUserFilter过滤器的工具类

public class SessionCheckUserFilter implements Filter {

	private List<String> listPath;

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// 放行的路径
		listPath = new ArrayList<String>();
		listPath.add("/index.jsp");
		listPath.add("/image.jsp");
		listPath.add("/WEB-INF/page/login.jsp");
		listPath.add("/sys/userAction_isLogin.action");
		listPath.add("/WEB-INF/page/menu/main.jsp");
		listPath.add("/WEB-INF/page/menu/left.jsp");
		listPath.add("/WEB-INF/page/menu/top.jsp");
		listPath.add("/sys/menuAction_main.action");
		listPath.add("/sys/menuAction_left.action");
		listPath.add("/sys/menuAction_top.action");

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest request=(HttpServletRequest) req;
		HttpServletResponse response=(HttpServletResponse) res;
		
		//获取session
		
		//获取得到的路径和请求
		//   ------/WEB-INF/page/menu/main.jsp
		String path=request.getServletPath();
		if(listPath!=null&&listPath.contains(path)){
			//如果包含这些路径和请求进行放行
			chain.doFilter(request, response);
			return;
		}
		
		//获取用户信息
	    User sessionUser=SessionUtils.getUserFromSession(request);
		if(sessionUser!=null){
			//放行
			chain.doFilter(request, response);
		}else{
			response.sendRedirect(request.getContextPath()+"/index.jsp");
		}
		
		
		
		
	}

	@Override
	public void destroy() {

	}

}
web.xml配置

        <filter>
		<filter-name>SessionCheckUserFilter</filter-name>
		<filter-class>cn.crm.filter.SessionCheckUserFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>SessionCheckUserFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
	</filter-mapping>

	<filter-mapping>
		<filter-name>SessionCheckUserFilter</filter-name>
		<url-pattern>*.action</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
	</filter-mapping>
参考文章:  https://blog.csdn.net/reggergdsg/article/details/52821502

                     http://www.cnblogs.com/coderland/p/5902878.html

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页