JSP Filter(过滤器)详解

JSP Filter(过滤器)详解

JavaWeb三大组件:Servlet程序、Filter过滤器、listener监听器

Filter过滤器:JavaEE的规范 接口

作用:拦截请求 过滤响应

使用步骤:

1.创建一个类,并实现Filter接口

//@WebFilter("/MyFilter")
public class MyFilter implements Filter {
	public MyFilter() {
	}
	public void destroy() {
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}
}

2.配置映射关系

  • 注解配置
//在类上边使用
@WebFilter("/MyFilter")
  • web.xml配置
	<filter>
		<filter-name>MyFilter</filter-name><!--过滤器名称-->
		<filter-class>com.dyz.filter.MyFilter</filter-class><!--类全限定名(类路径)-->
	</filter>
	<filter-mapping>
		<filter-name>MyFilter</filter-name><!--和上边的filter-name保持一致-->
		<url-pattern>*.jsp</url-pattern><!--拦截路径,这个表示拦截所有以.jsp结尾的文件-->
	</filter-mapping>

3.测试Filter内方法

public class MyFilter implements Filter {

	public MyFilter() {
		System.out.println("实例化Filter");
	}

	public void destroy() {
		System.out.println("销毁Filter");
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("进入doFilter");
//		chain.doFilter(request, response);//放行
	}

	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("初始化Filter");
	}
}
  • 启动Tomcat服务器

image-20210325102434704

发现构造方法和init方法会在服务器启动过程中就会执行

  • 访问一个jsp页面

image-20210325102406825

发现页面会是空白的,这是因为被过滤器拦截,没有放行

后台打印,表示进入doFilter方法,被拦截

image-20210325102629644

  • 关闭Tomcat服务器

image-20210325103014104

Filter执行destory销毁过滤器

4.配置login页面不被拦截

request.getContextPath() 获取请求当前项目路径

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("进入doFilter");
		//获取HttpServletRequest,必须先转为这个
		HttpServletRequest httpServletRequest = (HttpServletRequest)request;
		HttpServletResponse httpServletResponse = (HttpServletResponse)response;
		
		String uri = httpServletRequest.getRequestURI();//获取请求路径
		if(uri.contains("login")||session.getAttribute("name")!=null) {
			chain.doFilter(request, response);//过滤请求后 程序继续向下访问项目资源
		}else {
			httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login.jsp");
		}
	}

配置字符编码过滤器

1.实现Filter

//@WebFilter("/EncodingCharFilter")
public class EncodingCharFilter implements Filter {
	private String config;
	public EncodingCharFilter() {
		this.config = null;
	}
	public void destroy() {
	}
    /** 
    * name="FilterChar" <br> 
    * init-param name="config" value="utf-8"<br> 
    * mapping url-pattern="/*"<br> 
    */ 
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		HttpServletRequest req = (HttpServletRequest) request;

		HttpServletResponse res = (HttpServletResponse) response;

		req.setCharacterEncoding(config);
		res.setCharacterEncoding(config);
		chain.doFilter(req, res);
	}
    /** 
    * 获得web.xml中初始化的参数 
    */ 
	public void init(FilterConfig fConfig) throws ServletException {
		this.config = fConfig.getInitParameter("chars");
	}
}

2.web.xml配置

    <filter-name>EncodingCharFilter</filter-name> 
    <filter-class> 
    com.dyz.filter.EncodingCharFilter
    </filter-class> 
    <init-param> 
      <param-name>chars</param-name> 
      <param-value>utf-8</param-value> 
    </init-param> 
  </filter> 
  <filter-mapping> 
    <filter-name>EncodingCharFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
  </filter-mapping> 

版权声明:本文为weixin_52201271原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。