过滤器使用

过滤器-Filter

  • 是J2EE SERVLET下模块下的组件
  • Filter的作用是对URL做统一的拦截
  • Filter通常用于应用程序层面进行全局处理

过滤链:
E ---->tomcat{过滤器1->过滤器2->servlet/jsp}
jsp/servlet->过滤器2->过滤器1->响应

开发过滤器的三要素:

  • 任何接口都要实现javax.servlet.Filter接口
  • 在Filter的接口中doFilter()方法中写过滤器的功能代码
  • 在WEB.xml中对过滤器进行配置,说明URL的范围

开发我的第一个过滤器:

package com.imooc.filter;

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;

public class MyFirstFilter implements Filter{
    
    

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

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
    
    
		// TODO Auto-generated method stub
		System.out.println("过滤器已经生效");
		chain.doFilter(request, response);
		
	}

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

}

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>first-filter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  
  <filter>
  	<filter-name>myFirstFilter</filter-name>
  	<filter-class>com.imooc.filter.MyFirstFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>myFirstFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qA2vSQj4-1662049191297)(C:\Users\wangw\AppData\Roaming\Typora\typora-user-images\image-20220901232952408.png)]

过滤器的生命周期:

  1. 初始化【tomcat启动时Web应用被加载时过滤器对象被创建,并且立即加载init方法进行初始化,此时对象长期存在】

  2. 提供服务,每次资源加载都会被执行过滤器

  3. 销毁【应用重启、关闭时执行destory方法】

  4. 验证

    package com.imooc.filter;
    
    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;
    
    public class MyFirstFilter implements Filter{
          
          
    
    	@Override
    	public void destroy() {
          
          
    		// TODO Auto-generated method stub
    		System.out.println("过滤器已被销毁");
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
          
          
    		// TODO Auto-generated method stub
    		System.out.println("过滤器已经生效");
    		chain.doFilter(request, response);
    		
    	}
    
    	@Override
    	public void init(FilterConfig arg0) throws ServletException {
          
          
    		// TODO Auto-generated method stub
    		System.out.println("过滤器初始化成功");
    		
    	}
    
    }
    
    

过滤器的特性:

  • 过滤器对象在WEB应用启动时被创建且唯一
  • 唯一的过滤器对象在并发环境下采用"多线程"方法控制

过滤器的两种开发模式:(先执行配置的,在执行注解的)

  1. 在WEB.XML种配置

  2. 采用注解形式开发

    @WebFilter(filterName =“MyAnnoationFilter”,urlPatterns=“/*”)

  3. 配置与注解如何选择?

  • 配置形式维护性好,适合应用全局过滤
  • 注解形式开发体验更好,使用小项目敏捷开发

开发字符集过滤器

WEB中文乱码的解决:

[

  • GET请求-server.xml中增加URIEncoding=”UTF-8";
  • POST请求-使用request.setCharacterEncoding(“UTF-8”);
  • 响应-response.setContentType("text/html;charset=“UTF-8”);

]

package com.imooc.filter;

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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebFilter(filterName ="CharacterEncodingFilter",urlPatterns="/*")
public class CharacterEncodingFilter implements Filter{

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

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("执行字符过滤");
		// TODO Auto-generated method stub
		HttpServletRequest req =(HttpServletRequest)request;
		req.setCharacterEncoding("UTF-8");
		HttpServletResponse resp =(HttpServletResponse)response;
		resp.setContentType("text/html;charset=UTF-8");
		chain.doFilter(req,resp);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

过滤器参数化配置

过滤器为了增强灵活性,允许配置信息放在web.xml中

在web.xml中配置设置过滤器参数

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>first-filter</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  
  <filter>
  	<filter-name>myFirstFilter</filter-name>
  	<filter-class>com.imooc.filter.MyFirstFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  <filter-name>myFirstFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <!-- @WebFilter(filterName ="CharacterEncodingFilter",urlPatterns="/*") -->
    <filter>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<filter-class>com.imooc.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>GBK</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  <filter-name>CharacterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  
</web-app>

JAVA

package com.imooc.filter;

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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharacterEncodingFilter implements Filter{

	private String encoding;
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("执行字符过滤");
		// TODO Auto-generated method stub
		HttpServletRequest req =(HttpServletRequest)request;
		req.setCharacterEncoding(encoding);
		HttpServletResponse resp =(HttpServletResponse)response;
		resp.setContentType("text/html;charset="+encoding);
		chain.doFilter(req,resp);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		encoding = filterConfig.getInitParameter("encoding");
		System.out.println("编码为"+encoding);
	}

}

url-pattern设置过滤范围

url-pattern常用写法:

  • /index.jsp 执行资源精准匹配
  • /servlet/* 以前缀进行模糊匹配
  • *.jsp 以后缀进行模糊匹配

过滤链:

过滤器开发注意事项:

  • 每一个过滤器都具有单独职能
  • 执行顺序由filter-mapping顺序决定
  • 调用chain.doFilter()将请求向后传递

利用注解实现过滤链时,是根据类名的字典序执行的,所以一般这种都用配置文件配置

猜你喜欢

转载自blog.csdn.net/HBUT_WANGWEI/article/details/126653761
今日推荐