【Java学习笔记】——Filter

一、简介

      

      Filter可认为是Servlet的一种“加强版“,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。


二、用处


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


三、种类


  • 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求
  • 日志Filter:详细记录某些特殊的用户请求
  • 负责解码的Filter:包括对非标准编码的请求解码
  • 能改变XML内容的XSLT Filter
  • Filter可负责拦截多个请求或响应;一个请求或响应也可被多个Filter拦截

四、创建Filter


1、创建Filter处理类

     创建Filter必须实现javax.servlet.Filter接口,在该接口中定义了如下三个方法:
             1)、void init():用于完成Filter的初始化
             2)、void destroy():用于Filter销毁前,完成某些资源的回收
             3)、void doFilter():实现过滤功能。

2、web.xml文件中配置Filter

     可以通过注解或者在web.xml文件中通过配置文件进行配置
          1)配置Filter名
          2)配置Filter拦截URL模式

五、与Servlet的区别

 
     
     
       Filter的doFilter()方法里多了一个FilterChain的参数,通过该参数可以控制是否放行用户请求。在实际项目中,Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的代码复用。

      假设系统包含多个Servlet,这些Servlet都需要进行一些通用处理:比如权限控制、记录日志等,这将导致在这些Servlet的service方法中部分代码是相同的——为了解决这种代码重复的问题,可以考虑把这些通用处理提取到Filter中完成,这样各Servlet中剩下的只是特定请求相关的处理代码,而通用处理则交给Filter完成。





六、实例


      下边的Filter实例,对用户请求进行过滤,Filter将通过doFilter方法来设置Request编码的字符集,从而避免每个JSP、Servlet都需要设置;而且还会验证用户是否登录,如果没有登录,系统直接跳转到登录界面。

package com.tgb.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.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Filter
 * @author Kirn
 * 
 */
@WebFilter(filterName="authority"
		,urlPatterns={"/*"}
		,initParams={
			@WebInitParam(name="encoding",value="GBK"),
			@WebInitParam(name="loginPage",value="/login.jsp"),
			@WebInitParam(name="proLogin",value="/proLogin.jsp")
		}
	)
public class AuthorityFilter implements Filter
{
	//FilterConfig可用于访问Filter的配置信息
	private FilterConfig config;
	
	//实现初始化方法
	public void init(FilterConfig arg0) throws ServletException
	{
		this.config=config;
	}

	//实现销毁方法
	public void destroy()
	{
		this.config =null;

	}

	//执行过滤的核心方法
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException
	{
		// 获取Filter的配置参数
		String encoding = config.getInitParameter("encoding");
		String loginPage = config.getInitParameter("loginPage");
		String proLogin = config.getInitParameter("proLogin");
		
		//设置Request编码的字符集
		request.setCharacterEncoding(encoding);
		HttpServletRequest requ = (HttpServletRequest)request;
		HttpSession session = requ.getSession(true);
		
		//获取客户请求的页面
		String requestPath = requ.getServletPath();
		
		//如果session范围的user为null,则表明用户没有登录
		//且用户请求的既不是登录页面,也不是处理登录的页面
		if(session.getAttribute("user")==null 
				&& !requestPath.endsWith(loginPage) 
				&& !requestPath.endsWith(proLogin))
		{
			//forward到登录界面
			request.setAttribute("tip", "您还没有登录!");
			request.getRequestDispatcher(loginPage).forward(request, response);
		}
		//“放行”请求
		else {
			chain.doFilter(request, response);
		}		
	}
}

上边在Filter开头,采用了注解的方式,配置Filter。如果不采用注解的方式,也可以采用web.xml的配置文件的方式,具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   
   <!--定义Filter  -->
	<filter>
		<!--Filter的名字  -->
		<filter-name>authority</filter-name>
		<!--Filter的实现类  -->
		<filter-class>com.tgb.Filter.AuthorityFilter</filter-class>
		
		<!--下面三个init-param元素配置了三个参数  -->
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>loginPage</param-name>
			<param-value>/login.jsp</param-value>
		</init-param>
		<init-param>
			<param-name>proLogin</param-name>
			<param-value>/proLogin.jsp</param-value>
		</init-param>
	</filter>
	<!--定义Filter拦截的URL地址  -->
	<filter-mapping>
		<!--Filter的名字  -->
		<filter-name>authority</filter-name>
		<!--Filter负责拦截的URL  -->
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>




评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值