关闭

JSP -Filter

标签: javafilter
291人阅读 评论(0) 收藏 举报
分类:

什么是过滤器:

过滤器是一个服务器端的组件,它可以截取客户端的请求和服务端的响应信息,并对这些信息进行过滤。

过滤器工作原理:

编写第一个Filter实例:

Filter是实现的Filter接口 导入的是javax.servlet 包下的资源

一:创建一个类实现Filter接口,重写其中的doFilter().init().destory()方法

/*
 *  导入的jar包是javax.servlet.*;
 *  step:1-----
 *  在web.xml文件中配置,实例化一个Filter实例
*/

public class firstFilter implements Filter{
   //step:4
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("服务器关闭,销毁Filter  执行destory方法");
	}
    //step:3
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		System.out.println("开始运行doFilter--");
		arg2.doFilter(arg0, arg1);
		System.out.println("结束运行doFilter--");
	}
   // step:2
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("Filter初始化方法:init()");
	}
}


二::在web.xml文件中配置;



 <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
      <filter-name>Filter</filter-name>
       <filter-class>FirstFilter.firstFilter</filter-class>
  </filter>
  
  <filter-mapping>
  <filter-name>Filter</filter-name>
  <url-pattern>/index.jsp</url-pattern>
  </filter-mapping>
</web-app>
其中需要注意的是:

<url-pattern>中网址前面有一根 /    当用户请求index.jsp的时候就会触发该过滤器然后再发送给web资源

<filter-name>是可以随你自己指定的过滤器名字 

<filter-class>为filter的全名(包名加类名)

三:就是编写index.jsp文件了  :

我的是很简单的一句话

  <body>
    hello.firstFilter <br>
  </body>


看看Filter的实现过程:

step1:web.xml文件 实例化Filter

step2:执行过滤器中的init()方法读取web.xml文件中配置参数实现该过滤器的初始化 

以上两步在服务器启动时开始执行  成功执行

信息: Deploying web application directory E:\apache-tomcat-7.0.42\webapps\Filter
Filter初始化方法:init()
五月 04, 2017 8:13:58 上午 org.apache.catalina.startup.HostConfig deployDirectory

当服务器成功启动时  

step3:执行doFilter()方法这是过滤器实际的过滤操作   

step4:服务器关闭的时候就会执行destory方法

当客户访问indexjsp页面时触发过滤器执行过滤器的doFilter()方法  过滤后使用doFilter方法中FilterChain.doFilter()把请求转发给下一个过滤器或者web资源或者通过请求或转发发送给其他资源 ,资源响应后发送给客户的途中也会被过滤器拦截,过滤器处理响应后再发送给客户端(过滤器工作原理) 也就是过滤器会执行两次(这句话我总感觉有问题)    

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

————————————————————————————————————————————————————————--—————————-

滤器链:

就是对一个网页进行多个过滤

过滤器链的工作原理:


当用户发送请求请求Web资源时,过滤器1会首先获取用户的请求,对请求进行过滤,然后执行FilterChain.doFilter()将请求发送给过滤器2,过滤器2在过滤了用户请求之后执行FilterChain.doFilter()方法请求实际的Web资源,Web资源的响应将首先被过滤器2获取,在过滤器2对响应进行过滤之后将响应传递给过滤器1,在过滤器1过滤之后才将响应发送给用户

实现一个过滤链 :

package FirstFilter;
	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;

	/*
	 *  导入的jar包是javax.servlet.*;
	 *  step:1-----
	 *  在web.xml文件中配置,实例化一个Filter实例
	*/

	public class secondFilter implements Filter{
	   //step:4
		public void destroy() {
			// TODO Auto-generated method stub
			System.out.println("服务器关闭,销毁Filter2  执行destory方法");
		}
	    //step:3
		public void doFilter(ServletRequest arg0, ServletResponse arg1,
				FilterChain arg2) throws IOException, ServletException {
			System.out.println("开始运行doFilter2--");
			arg2.doFilter(arg0, arg1);
			System.out.println("结束运行doFilter2--");
		}
	   // step:2
		public void init(FilterConfig arg0) throws ServletException {
			// TODO Auto-generated method stub
			System.out.println("Filter2初始化方法:init()");
		}
	}

xml文件配置:

其中只有url配置一样才能组成一个过滤链

<filter>
      <filter-name>Filter</filter-name>
       <filter-class>FirstFilter.firstFilter</filter-class>
  </filter>
  
  <filter-mapping>
  <filter-name>Filter</filter-name>
  <url-pattern>/index.jsp</url-pattern>
  </filter-mapping>
  
    <filter>
        <filter-name>sFilter</filter-name>
        <filter-class>FirstFilter.secondFilter</filter-class>
    </filter>
    
    <filter-mapping>
  <filter-name>sFilter</filter-name>
  <url-pattern>/index.jsp</url-pattern>
  </filter-mapping>
</web-app>


执行结果:




我发现filter执行init()方法时  先执行的第二个过滤器     destory时也是

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------=----------------------------------------------------------

=====================----=-=-=-=-=--=-==--=============================================================================================-

过滤器的分类:

所谓过滤器的分类就是指定义的过滤器对哪一种类型的请求进行过滤,具体体现在在web.xml文件中声明一个过滤器时,声明的dispatcher标签的值,具体的取值及用法可以参考下图(图片转自慕课网)。



1、REQUEST

这个类型是最常用的,也是dispatcher标签的默认值,表示用户直接请求一个Web资源时触发过滤器。之前介绍的几个过滤器实例都是REQUEST类型的,当用户直接请求index.jsp页面时触发了相应的过滤器
例子就是firstFliter类,配置文件 没变默认的dispatcher为request 

public class firstFilter implements Filter{
   //step:4
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("服务器关闭,销毁Filter  执行destory方法");
	}
    //step:3
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) 
			throws IOException, ServletException {
		System.out.println("First Filter------doFilter start");  
        HttpServletResponse response = (HttpServletResponse) arg1; 
         
        response.sendRedirect("index.jsp");
        arg2.doFilter(arg0, arg1);  
        System.out.println("First Filter------doFilter end");  
	}

   // step:2
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("Filter初始化方法:init()");
	}
}








当使用重定向时由于属于两次不同的请求,所以服务器无限循环该过滤器()直到浏览器提示重定向过多  当然不再重定向到index.jsp就不会出现这个错误

如果将重定向改为服务器内部转发,会有什么结果呢?再次修改FirstFilter的doFilter()方法,使用HttpServletRequest..getRequestDispatcher("index.jsp").forward(arg0, arg1)方法将请求转发给index.jsp。

2、FORWARD

服务器内部转发:特点是页面跳转不会改变url 相当于同一次请求,在服务器内部跳转  也就是说相对而言更消耗资源
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) 
			throws IOException, ServletException {
		System.out.println("First Filter------doFilter start");  
         HttpServletResponse response = (HttpServletResponse) arg1; 
         HttpServletRequest request =(HttpServletRequest) arg0;
       request.getRequestDispatcher("hello.jsp").forward(request,response);
       
       arg2.doFilter(arg0, arg1);  
        System.out.println("First Filter------doFilter end");  
	}

配置文件:
 </welcome-file-list>
  <filter>
      <filter-name>Filter</filter-name>
       <filter-class>FirstFilter.firstFilter</filter-class>
         </filter>
  
  <filter-mapping>
   <filter-name>Filter</filter-name>
   <url-pattern>/index.jsp</url-pattern>
    <dispatcher>FORWARD</dispatcher>  
  </filter-mapping>
 
   <filter-mapping>
   <filter-name>Filter</filter-name>
   <url-pattern>/main.jsp</url-pattern>
    <dispatcher>FORWARD</dispatcher>  
  </filter-mapping>

3、INCLUDE

和forward差不多所以这里就不说了

4、ERROR


当我们输入不存在的页面url时 浏览器会提示我们404错误  如何把错误信息变得更容易处理和美观就需要使用ERROR dispatcher了

如何实现:
①:创建一个过滤器

ublic class errorfilter implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub

	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
system.out.print("有错误信息");
                        arg2.doFilter(arg0, arg1);
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

②:web.xml文件配置:
 <error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
  </error-page>
    <filter>
        <filter-name>error</filter-name>
        <filter-class>Filterfenlei.errorfilter</filter-class>
    </filter>
     <filter-mapping>
   <filter-name>error</filter-name>
   <url-pattern>/error.jsp</url-pattern>
    <dispatcher>ERROR</dispatcher>  
  </filter-mapping> 
</web-app>
③:创建一个error.jsp 

其中<error-page>标签是获得浏览器抛出的错误,如果是404我们就跳转到error.jsp (有斜杠)  然后Filter就会拦截该页面进行处理然后再给web资源处理

我试了一下如果在error Filter 中使用页面跳转的话会发生错误

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
       System.out.println("有错误信息");
       HttpServletResponse response = (HttpServletResponse) arg1;
       response.sendRedirect("error.jsp");
            arg2.doFilter(arg0, arg1);
	}

	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
五月 04, 2017 5:04:59 下午 org.apache.catalina.core.StandardHostValve custom
严重: Exception Processing ErrorPage[errorCode=404, location=/error.jsp]
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.IllegalStateException: Cannot create a session after the response has been committed


0
0
查看评论

jsp Filter 实现编码过滤,和登录验证

登陆页面login.jsp     用户名:                   ...
  • zmzsoftware
  • zmzsoftware
  • 2011-09-06 14:16
  • 2734

配置Filter拦截直接访问的jsp

编辑拦截类: package com.netsdar.message.intercepters; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterC...
  • feel0o0
  • feel0o0
  • 2017-10-16 09:09
  • 119

Filter过滤器只过滤jsp不过滤action请求的解决方案

解决办法:在web.xml中将filter的配置放在struts2配置的前面。如下例子:         validateFilter       &#...
  • crurtyx
  • crurtyx
  • 2011-08-30 10:54
  • 293

servlet,jsp,listener,filter作用详解

目前基于java的开发基本稳定。 JavaEE开发大致分为两种:以spring为核心的轻量级JavaEE企业开发平台;以EJB3+JPA为核心的经典JavaEE开发平台。前者降低了开发、部署成本。 在需要具有高度伸缩性、高度稳定性的企业应用里,如银行系统、保险系统,以EJB3+JPA为核...
  • hao707822882
  • hao707822882
  • 2014-09-26 20:06
  • 972

JSP过滤器Filter配置过滤类型汇总

一、配置方法 1 映射过滤应用程序中所有资源     loggerfilter     myfilter.LoggerFilter     loggerfilter     /* //访问当前主机,当前应用程序根下...
  • woshixuye
  • woshixuye
  • 2014-02-17 17:42
  • 12332

Invalid <url-pattern> /admin/*.jsp in filter mapping

要解决这个问题,知道其发生的原因,就是了解 url-pattern 的规则。Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单。servlet和filter中的url-pattern有一些文章在里面的,总结了一些东西,以免遇到问题又要浪费时间。 一、先精确...
  • testcs_dn
  • testcs_dn
  • 2017-08-08 12:50
  • 1146

java web中配置Filter解决jsp中文乱码问题

具体的做法:    建立一个实现 Filter 接口的类。这个类需要三个方法,分别是: doFilter 、 init 和 destroy 。 doFilter 方法包含主要的过滤代码, init 方法建立设置操作,而 destroy 方法进行清除。    比...
  • yinxianluo
  • yinxianluo
  • 2014-11-22 21:00
  • 1142

【JSP开发】自己写的过滤器Filter例子

目的是让浏览网站的用户所接收到的信息的编码方式统一为UTF-8,防止乱码的产生 1.没加过滤器之前: 拿Jsp工程(名叫web)中的两个Servlet做实验 ChineseServlet.java: package cn.edu.hpu.servlet; import java.io.IOE...
  • u013517797
  • u013517797
  • 2015-03-06 15:53
  • 3295

Servlet,filter, struts,jsp之间的关系

java web 开发,入门的知识,servlet编写,注册,生命周期的方法, HttpServletRequest,HttpServletResponse的相关的知识,其均是以HTTP协议为操作原理。 因为静态 web服务器调用本质流程: 1. web  服务器(如:IIS,...
  • px348402717
  • px348402717
  • 2016-10-07 19:52
  • 450

使用Filter过滤器,控制不能直接访问JSP文件

在项目中,我们需要控制用户不能直接访问JSP页面,需要实现此功能很简单,1.使用过滤器控制如果用户请求了JSP页面,直接跳转到指定的URL,如主页,2.在web.xml文件中配置,当服务器启动时,自动加载过滤器 1、编码JspFilter过滤器,需要实现Filter package com.we...
  • kity9420
  • kity9420
  • 2015-08-08 22:23
  • 2623
    个人资料
    • 访问:28277次
    • 积分:1300
    • 等级:
    • 排名:千里之外
    • 原创:80篇
    • 转载:41篇
    • 译文:13篇
    • 评论:0条
    最新评论