栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Filter过滤器(1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Filter过滤器(1)

一.Filter与Listener
Filter和Listener是Servlet规范中的两个高级特性,不同于Servlet,他们不用于处理客户端请求。Filter是用于对request、response对象进行修改,Listener用于对context、session、request事件进行监听。善用Servlet规范中的这两个高级特性能够轻松地解决一些特殊问题。
二.Filter详解:
Filter被称作为过滤器,其基本功能就是对Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。这好比我们生活中所用到的净水器一样,他可以看做一个过滤器,专门来过滤杂质,Filter在web应用中的拦截过程如下图所示:

我们如上图所示,当浏览器访问服务器中的目标资源中,会被Filter拦截,在Filter中进行预处理,然后再将请求转发给目标资源。当服务器接收到这个请求会对其进行响应,在服务器处理响应的过程中,也需要将响应结果发送给过滤器,在过滤器中对响应结果进行处理后,才会发送给客户端。
2.1实现第一个Filter程序:
为了快速了解Filter的开发过程,接下来,分布实现一个Filter程序,演示Filter程序如何对Servlet程序的调用过程进行拦截,具体如下:
(1)首先创建一个名为chapter09的·web项目,然后再该项目的src目录下创建一个名为cn.itcast.chapter009.filter包,最后在该包下一个名为MyServlet的类Servlet类,该类用于访问时在浏览器输出“dashuju2003”。MyServlet类的具体代码如下

package cn.itcast.chapter009.filter;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		response.getWriter().write("dahsuju2003");;
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

(2)在web.xml文件对Servlet进行如下配置。

  
    myServlet
    cn.itcast.chapter009.filter.MyServlett
  
  
    MyServlet
    /MyServlet
  
 

运行结果如下图所示:在Tomact服务器下,在浏览器地址输入“http://localhost:10081/chapter009/MyServlet”,此时就可以看到浏览器成功访问到了MyServlet程序:

(3)在cn.itcast.chapter08.filter包中创建一个MyFilter的Filter类,该类用于拦截MyFilter的Filter类,该类用于拦截MyServlet程序。MyFilter的实现代码如下:

package cn.itcast.chapter009.filter;

import java.io.*;

import javax.servlet.Filter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;

@WebServlet("/MyFilter")
public class MyFilter extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public MyFilter() {
        super();
        // TODO Auto-generated constructor stub
    }

	
	protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) 
			throws IOException, ServletException{
		// TODO Auto-generated method stub
		PrintWriter out=response.getWriter();
		out.write("dashuju2003");
	}
	
	public void destroy() {
		// TODO Auto-generated method stub
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

/过滤器程序与Servlet程序类似,同样需要在Web.xml文件中进行配置,从而设置它所拦截的资源,具体代码如下://


    MyFilter
    cn.itcast.chapter009.filter.MyFilter
  
  
    MyFilter
    /MyFilter
  

3.Filter映射

3.1 拦截不同方式的访问请求
在web.xml文件中,一(个ilter-mapping>元素用于配置一个Fller 所负责拦数的资源。元素中有一个特殊的子元素 1 ) REQUEST
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问的,那么该过滤器将不会被调用。
2 ) INCLUDE
如果目标资源是通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
3 ) FORWARD
如果目标资源是通过RequsDispatcler的foward)方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
4) ERROR !
如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。除此之外,过滤器不会被调用。
为了更好地理解上述4个值的作用,接下来以FORWARD为例,分步骤演示Filter对转发请求的拦截效果。
(1)在chapter009项目的cn.itcast.chapter009.filter包中,创建一个名为ForwardServlet的Servlet类,该类用于将请求发给first.jsp页面,代码如下:

package cn.itcast.chapter009.filter;
import java.io.*;

import javax.servlet.ServletException;
import javax.servlet.http.*;

public class ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		request.getRequestDispatcher("/first.jsp").forward(request,response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

(2)在web.xml文件中,配置ForwardServlet信息,代码如下:

   
    ForwardServlet
    cn.itcast.chapter009.filter.ForwardServlet
  
  
    ForwardServlet
    /ForwardServlet
  

(3)在chapter009项目的WebContent目录中创建一个first.jsp页面,该页面用于输出内容,如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


	first.jsp


(4)在cn.itcast.chapter009.filter包中,创建一个过滤器ForwardFilter.java,该过滤器专门用于对first.jsp页面进行拦截代码如下:

package cn.itcast.chapter009.filter;

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;


@WebFilter("/ForwardFilter")
public class ForwardFilter implements Filter {
	public void destroy() {
		// TODO Auto-generated method stub
	}

	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		// 用于拦截用户请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
		PrintWriter out = response.getWriter();
		out.write("dahuju2003");
		chain.doFilter(request, response);
	}

	
	public void init(FilterConfig fConfig) throws ServletException {
		// 过滤器对象在初始化时调用,可以配置一些初始化参数;
	}

}

(5)在wen.xml文件中,配置过滤器的映射信息,拦截first.jsp页面,代码如下:

   
   ForwardFilter
    cn.itcast.chapter009.filter.ForwardFilter
  
  
    ForwardFilter
    /ForwardFilter
  

(6)最后启动服务器,在浏览器输入地址“http://localhost:10081/chapter009/ForwardServlet”页面就会访问出来,访问结果为/*first.jsp//
2020080603052

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659112.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号