读书笔记-Filter

本文介绍了Servlet Filter的工作原理,包括其在处理用户请求和响应过程中的作用。详细阐述了创建Filter的步骤,通过代码示例展示了如何在Filter中实现预处理和后处理,以及如何检查用户请求和实现网站伪静态。Filter的关键在于`doFilter()`方法,它通过`chain.doFilter(request, response)`来控制请求的传递。此外,还提供了检查用户登录和实现URL重写以实现伪静态的示例代码。" 12833287,401807,使用Chart绘制曲线值的技巧,"['数据可视化', '前端开发', '图表库']
摘要由CSDN通过智能技术生成

1.Filter可认为是Servlet的一种加强版,使用Filter完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet处理并生成相应,最后Filter再对服务器响应进行后处理。


2.创建一个Filter需要两个步骤:

   ⑴创建Filter处理类,必须实现javax.Servlet.Filter接口,重写三个方法

       void init(FilterConfig config):用于完成Filter的初始化;

       void destroy():用于Filter销毁前,完成某些资源的回收;

       void doFilter(ServletRequest request,ServletResponse response,Filterchain chain);

       实现过滤功能,该方法就是对每个请求以及响应增加的额外处理;

Filter处理类源代码:

public class FilterClass implements Filter{
  private FilterConfig config;
       
  public void init(FilterConfig config){
	      this.config=config;
 }
  
  public void destroy(){
	 this.config=null;
 }
  
  public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException{
	 ServletContext context=this.config.getServletContext();
	 long before=System.currentTimeMillis();
	 System.out.println("开始过滤。。。");
	 HttpServletRequest hsrrequest=(HttpServletRequest)request;
	 System.out.println("Filter已经截获的用户请求的地址:"+hsrrequest.getServletPath());
	 chain.doFilter(request, response);
	 long after=System.currentTimeMillis();
	 System.out.println("过滤结束,请求被定为到:"+hsrrequest.getRequestURI()+"所花时间为"+(after-before));
 }
}
   ⑵配置Filter:

   Annotation方式:@WebFilter(filterName="state" urlPatterns={"/*"}).

   web.xml方式:

  <filter>
  	<filter-name>state</filter-name>
    <filter-class>Filter.FilterClass</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>state</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
在Filter配置中的url元素,/*表示Filter会拦截所有用于请求,所以在Web项目中新建任意一个jsp,访问该jsp即可测试Filter。

测试结果:



3.Filter处理类中的doFilter()方法用于对用户的请求进行预处理和对服务器的响应进行后处理,两者的界线在于

chain.doFilter(request, response);该方法表示将用户请求继续提交给服务器,执行该方法前表示对用户请求进行预处理,执行该方法后表示对服务器响应进行后处理。


4.Filter和Servlet极其相似,区别只是Filter的doFilter()方法中多了一个chain参数,该参数用于控制是否放行用户请求。通常Filter中的doFilter()方法的代码是多个Servlet的Service()方法中抽取的通用代码,比如字符编码的设置,检查用户的请求,通过Filter可以更好的实现代码的复用。


5.检查用户请求Filter实例:(该Filter用于检查JSP表单提交请求,若用户名或者密码为空,则跳转到错误提示JSP页面,都不为空则跳转到成功登录页面)

Filter处理类源代码:

public class FilterTest implements Filter{
  private FilterConfig config;
       
  public void init(FilterConfig config){
	      this.config=config;
 }
  
  public void destroy(){
	 this.config=null;
 }
  
  public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException{
	 HttpServletRequest hsrrequest=(HttpServletRequest)request;
	 if(hsrrequest.getParameter("username").equals("")||hsrrequest.getParameter("password").equals("")){
		 request.getRequestDispatcher("/error.jsp").forward(request, response);
	 }
	 else{
		 chain.doFilter(request, response);
	 }
 }
}
该Filter用于检验用户的表单提交请求,如果用户名或者密码有一个为空,则跳转到错误页面jsp,否则继续提交给正常登录页面。

web.xml中配置该Filter:

  <filter>
  	<filter-name>user</filter-name>
    <filter-class>Filter.FilterTest</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>user</filter-name>
    <url-pattern>/login.jsp</url-pattern>
  </filter-mapping>

JSP运行结果:

当输入用户名和密码为空时:


当输入正确的用户名和密码时:



6.Filter还可以用于实现网站伪静态。大部分搜索引擎都会优先考虑收录静态的html页面,而不是动态的jsp或者php页面,所以可以将jsp,php页面伪装成静态的html页面,可以通过Filter拦截所有发向*.html请求,然后forward到对应的*.jsp页面即可。可以使用URL Rewrite实现。

步骤:

⑴下载urlrewritefilter-4.0.3.jar,放入web项目的WEB-INF/lib下

⑵配置Filter:

<filter>
	<filter-name>UrlRewriteFilter</filter-name>
	<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>UrlRewriteFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

⑶在WEB-INF下增加urlrewrite.xml文件,该文件定义了伪静态映射规则:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
	"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
	<rule>
		<!-- 所有配置如下正则表达式的请求 -->
		<from>/(\w*).html</from>
		<!-- 将被forward到如下JSP页面-->
		<to type="forward">/$1.jsp</to>
	</rule>
</urlrewrite>

如上所示,所以发向html页面的请求,都会被forward到相同名字的jsp页面,即将jsp页面伪装成了html页面。

运行结果:


在地址栏中访问hello.html,实际上是访问hello.jsp


源代码和jar包下载地址:  http://pan.baidu.com/s/1ntC2C7v



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值