web过滤器

什么是Filter?

Filter,过滤器,就是在页面跳转或者传值时加的一个批处理操作,例如:,在servlet中利用request接收传值时,很重要的一个问题就是传值乱码问题,通常使用setcharacter()方法进行相应的乱码处理,但是每次都需要写,很麻烦,所以,利用过滤器Filter可以批量进行处理。

Filter作用

当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件web.xml设置的过滤规则,能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response。 —— filter实际是一个servlet chaining(servlet 链)

  • 在servlet被调用之前截获;
    
  • 在servlet被调用之前检查servlet request;
    
  • 根据需要修改request头和request数据;
    
  • 在servlet被调用之后截获.
    
  • 根据需要修改response头和response数据;
    

过滤器生命周期的四个阶段:

  1. 实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化。Web容器回调它的无参构造方法。

  2. init 初始化:实例化完成之后,马上进行初始化工作。Web容器回调init()方法。

  3. dofilter 过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工作方法。

  4. destory销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。

具体的代码案例

一. 配置
配置dtd文件

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT gzmvc (ation*)>
<!ELEMENT ation (lt+)>
<!ELEMENT lt (#PCDATA)>

<!ATTLIST ation name ID #REQUIRED class CDATA #REQUIRED>
<!ATTLIST lt name CDATA #REQUIRED>

配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE gzmvc SYSTEM "gz.dtd">
<gzmvc>
	<ation name="user" class="servlet.LoginServlet">
		<lt name="a">a.jsp</lt>
		<lt name="b">b.jsp</lt>
	</ation>
	
	<ation name="pro" class="servlet.LoginServlet2">
		<lt name="a">c.jsp</lt>
		<lt name="b">d.jsp</lt>
	</ation>
</gzmvc>

dtd xml编写方法见(https://blog.csdn.net/qyh1839568472/article/details/114291972

在web.xml中加入filter配置

<filter>//过滤器实现,以及地址 
  	<filter-name>gzmvc</filter-name>//定义名字  
  	<filter-class>filter.GZFilter</filter-class>//实现类
  </filter>
  <filter-mapping>
  	<filter-name>gzmvc</filter-name>
  	<url-pattern>*.cn</url-pattern>//映射过滤器拦截规则  
  </filter-mapping>
  <context-param>//自己定义的xml文件
  	<param-name>mvc</param-name>
  	<param-value>gz.xml</param-value>
  </context-param>

filter.GZFilter

package filter;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import inf.GZAtion;

public class GZFilter implements Filter{
public static HashMap<String, String> ationMap=new HashMap<String, String>();//存储ation中name,class值
public static HashMap<String, String> ltMap=new HashMap<String, String>();//存储lt中name,内容
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain arg2)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req=(HttpServletRequest) request;
		HttpServletResponse res=(HttpServletResponse) response;
		String url=new String(req.getRequestURL());
		url=url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("."));
		GZAtion ation=(GZAtion) getAtion(req, url);
		if(ation!=null) {
			try {
				String re=ation.excute(req,res);
				String path = ltMap.get(url+"_"+re);
				res.sendRedirect(path);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else {
			System.err.println("没有"+url+"项");
		}
		
	}

	public GZAtion getAtion(HttpServletRequest req,String url) {
		GZAtion gz=null;
		try {
			String xml=req.getServletContext().getInitParameter("mvc");//接收web.xml的文件名称
			String file=req.getRealPath("/")+xml;// req.getRealPath("/")得到部署路径
			SAXReader sax=new SAXReader();//实例化解析器
			Document doc=sax.read(file);//读取文件
			Element root =doc.getRootElement();//读取根节点
			List<Element> es=root.elements();//读取子节点
			for(Element e:es) {//遍历子节点
				String aname=e.attributeValue("name");//取出子节点(ation)中 name的值
				String cls=e.attributeValue("class");//取出子节点(ation)中 class的值
				ationMap.put(aname, cls);//存储
				List<Element> es2=e.elements();//读取子节点中的子节点
				for(Element e2:es2) {//遍历子节点
					String ltname=e2.attributeValue("name");//取出子节点(lt)中 name的值
					String path=e2.getText();//读出lt里的*.jsp
					ltMap.put(aname+"_"+ltname, path);
				}
			}
			String cls=ationMap.get(url);//通过url子节点(ation)中 class的值
			if(cls!=null) {
				//反射
				Class cl=Class.forName(cls);
				gz= (GZAtion) cl.newInstance();//实例化
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return gz;
	}
}

inf.GZAtion.java

package inf;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface GZAtion {
	public String excute(HttpServletRequest request,HttpServletResponse response) 
			throws Exception;
}

servlet

package servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import inf.GZAtion;

public class LoginServlet implements GZAtion{

	@Override
	public String excute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		return "a";
	}

}

package servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import inf.GZAtion;

public class LoginServlet2 implements GZAtion{

	@Override
	public String excute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		return "b";
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值