10.《JavaEE 学习笔记》filter过滤器

1、概念

过滤器(filter)是一种代码重用的技术,它可以改变HTTP请求的内容,响应,及Header信息。过滤器通常不产生响应或像Servlet那样对请求作出响应,而是修改或调整到资源的请求,以及来自资源的响应。过滤器可以作用于所有Web资源,即动态或静态内容。

过滤器是指拦截请求,并对传给被请求资源的ServletRequest 或 ServletResponse 进行处理的一个对象。过滤器可以用于登录、加密和解密、会话检查等等。过滤器可以配置为拦截一个或多个资源。如果同一个资源或同一组资源中应用了多个过滤器,则调用顺序有显示显得比较重要,这时候就需要部署描述符(web.xml)来控制其先后顺序。

2、Filter 相关的API

2.1 Filter接口

方法:

  • init(FilterConfig filterConfig) 该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次。参数FilterConfig可以获得filter的初始化参数(初始化参数参见下面章节)。
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法。方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资
  • destroy() 该方法在容器销毁过滤器对象前被调用。

2.2 FilterChain接口

该接口类型作为Filter接口中doFilter方法的参数使用。

方法:

  • doFilter(ServletRequest request,ServletResponse response) 该方法可以将当前的请求和响应传递到过滤链上的下一个资源,可能是下一个过滤器,也可能是目标资源。

2.3 FilterConfig接口

该接口类型作为Filter接口中的init方法的参数使用。

方法

  • getInitParameter(String name) 该方法用来获得过滤器的初始化参数值。在web.xml中,可以为每一个filter配置需要的初始化参数,与Servlet的类似。过滤器的初始化参数即可通过FilterConfig中的getInitParameter方法获取。

代码案例:

解决中文乱码过滤器:

package com.company.project.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("正在初始化过滤器");
        
        HttpServletRequest request = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;
        
        if (request.getRequestURI().contains(".css") || request.getRequestURI().contains(".js"))
        {
          chain.doFilter(request, response);
        }
        else
        {
            response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");          
        chain.doFilter(request, response);
        }   
    }
}

3、 XML配置过滤器

配置项说明

<filter>中配置项:
    <filter-name>:过滤器的名称
    <filter-class>:该过滤器对应的配置类
    <init-param>:初始化参数
    <param-name>:参数名称
    <param-value>:参数值 
<filter-mapping>中配置项:
    <filter-name>:过滤器名称,和<filter>中的<filter-name>相同
    <url-pattern>:过滤器过滤的资源路径
    <dispatcher>:指定过滤器过滤的资源的调用方式,默认为REQUEST

dispatcher取值和意义

  • REQUEST:如果资源的调用方式是RequestDispatcher的forward()或include(),那么该资源路径即使匹配,过滤器也不会起作用
  • FORWARD:调用方式是RequestDispatcher的forward()起作用
  • INCLUDE:调用方式是RequestDispatcher的include()起作用
  • ERROR:如果该资源适配异常处理机制调用,则该过滤器起作用
  <!-- 配置过滤器对象名称,过滤器类的路径,初始化参数 -->
  <filter>
    <filter-name>characterFilter</filter-name>
    <filter-class>com.company.project.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>author</param-name>
        <param-value>86_god</param-value>
    </init-param>
  
  </filter>
  
  <!-- 配置过滤器处理的作用域和类型  -->
  <filter-mapping>
    <filter-name>characterFilter</filter-name>
    <url-pattern>*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

获取过滤器初始化参数:

package com.company.project.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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharacterEncodingFilter implements Filter {
    private String author;
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);        
        //获取初始化参数,使用filterConfig.getInitParameter("filter-name")方法获取
        this.author = filterConfig.getInitParameter("author");
        System.out.println("author:"+this.author);
    }
}

4. 网页错误处理页面

我们的web通常404,500等错误,可能会暴露我们的源码,这是我们不希望让用户看见的,我们可以利用web.xml中配置错误页面来捕捉和处理这种错误页面,让用户看见和谐的页面。

image.png
image.png

处理方案:

在web.xml文件中配置错误页面,在<web-app></web-app>中间加上如下代码。还需要在location相关的页面的前面加上指令元素<%@page{iserrorPage="true"} %>

  <error-page>
  <!--exception-type是异常的类型  -->
  <!--location是遇到异常应该显示的页面  -->
    <exception-type>java.lang.Exception</exception-type>
    <location>/error.jsp</location>
  </error-page>
  <error-page>
    <!--error-code是网页异常的代号编码  -->
    <error-code>404</error-code>
    <location>/404.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
  </error-page>

每日心语:

山有山的高度,水有水的深度,没必要攀比,每个人都有自己的长处;风有风的自由,云有云的温柔,没必要模仿,每个人都有自己的个性。你认为快乐的,就去寻找;你认为值得的,就去守候;你认为幸福的,就去珍惜。没有不被评说的事,没有不被猜测的人。做最真实的自己,依心而行,无憾今生。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容