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

J2EE/JAVA——多重filter过滤器使用与两种配置方法

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

J2EE/JAVA——多重filter过滤器使用与两种配置方法

1.什么是filter?

        filter过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理
通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。

在对应的包下,可以通过New——》filter来创建过滤器。

2.filter的用法

一个简单filter的语法形式:

public class MyFilter implements Filter {
    public void destroy() {
        
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        
        chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
    }

    public void init(FilterConfig config) throws ServletException {
        
    }

}

filter和Servlet形式一样,都有生命周期,都是先进行init的初始化然后就是doFilter进行过滤,在doFilter()方法中,需要使用chain.doFilter进行放行,然后交给下一个过滤器或servlet处理。

3.filter的配置方法 (1)在web.xml中进行配置

配置语法:

  
     过滤器名 
     过滤器类的位置 
  
  
     过滤器名 
     /过滤器处理的Servlet 
  

 (2)使用注解配置

        使用注解配置就是在过滤器的类之前加入一句

@WebFilter("/过滤器处理的Serlet")

就可以完成配置,当这个过滤器要过滤所有的Servlet时,将/servlet换成 } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { chain.doFilter(req, resp);//交给下一个过滤器或servlet处理 } public void init(FilterConfig config) throws ServletException { } }

@WebFilter("
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        
        chain.doFilter(req, resp);//交给下一个过滤器或servlet处理
    }

    public void init(FilterConfig config) throws ServletException {
        
    }

}
3.多重过滤器的使用方法

        首先要在一个项目中使用多个过滤器,就要在web.xml文件或者使用注解对Servlet进行配置,值得注意的是,在配置中,过滤器的顺序是根据web.xml文件中的顺序所决定的。

Servlet源码:

public class MyServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		// 1这里不用再设置编码和处理中文乱码问题,因为过滤器已经预设过了
		// 2这里只需要处理核心业务 
		PrintWriter out = response.getWriter();
		out.write("这里是Servlet的输出,Servlet工作中...模拟的是核心业务");
	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

第一个过滤器源码:

public class MyFilter01 implements Filter {
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 过滤器也可以给出响应,但不是处理业务,它只是准备的需要
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		// 让客户端也可以看到过滤效果,相当于是把核心内容包装成了一个HTML页【HTML标签首】
		out.write(""
				+ "Filter and Servlet"
				+ "");
		out.write("这里是过滤器01工作中开始...模拟的是一号过滤器
"); // 但核心业务仍然得放行,交给相应的Servlet去处理,项目中,职责要清晰 chain.doFilter(request, response); // 【HTML标签尾】 out.write("
这里是过滤器01工作中结束...
"); out.write(""); } }

第二个过滤器源码:

public class MyFilter02 implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 过滤器在这里做的工作,与之前对比,仅只是想在客户端,即浏览器中也可以看到它的存在
		PrintWriter out = response.getWriter();
		out.write("这里是过滤器02工作中开始...模拟的是二号过滤器
"); // 放行后,核心业务仍然走Servlet处理 chain.doFilter(request, response); out.write("
这里是过滤器02工作中结束...
"); } }

web.xml文件内容:



  j2018001001_08_servletAndMultiFilters
  
    MyFilter01
    filter.MyFilter01
  
  
    MyFilter01
    /MyServlet
  
  
    MyFilter02
    filter.MyFilter02
  
  
    MyFilter02
    /MyServlet
  
  
    MyServlet
    servlet.MyServlet
  
  
    MyServlet
    /MyServlet
  
  
    index.jsp
  

运行结果:

 同理我们也可以使用注解的方式进行配置:

首先我们将web.xml文件中的关于过滤器02的配置全部注释掉:

此时如果我们继续运行Servlet,那么过滤器02就不会工作:

 

现在我们在过滤器02中加入注解配置:

 

以上两种均可以。

现在再次运行那么过滤器02再次工作。

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

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

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