Filter过滤器(Servlet)

Filter,简单的说就是用来过滤从客户端发送到服务器端的信息。

创建Filter的过程:

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

public class MyFilter implements Filter

2.在配置文件中修改配置信息:

 <filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

过滤器相关的配置和过滤链:

配置:

url-partern :指示在哪个位置进行拦截(过滤)

dispacher  :包含四个内置属性:

  ERROR:错误页面跳转

  FORWORD:请求转发

  INCLUDE:请求包含(页面中包含的文件)

  REQUEST:请求request

过滤链:

FilterChain:将过滤器连接成一条链。放行方向为下一个过滤器,这个顺序是由在XML文件中filter-mapping的顺序决定的;如果没有下一个过滤器就指向服务器

应用:将Request请求信息进行过滤用来解决中文乱码问题

1.创建过滤器类:

package com.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;

public class MyFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //将request增强
        //创建一个request的对象,因为这里是ServletRequest的request不能使用HTTPServletRequest的特有的传递doGet,doPost方法,所以要向下转型
        HttpServletRequest req = (HttpServletRequest) request;
        SuperHttpServletRequest superRequest = new SuperHttpServletRequest(req);
        chain.doFilter(superRequest, response);
    }

    @Override
    public void destroy() {
    }
}

2.创建重写类,重写getParameter方法,使得该方法加强

package com.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class SuperHttpServletRequest extends HttpServletRequestWrapper {
    /**
     * 实现的是类而不是接口的好处:实现接口就要实现其所有的方法
     * 而类只需要重写就行了,因为继承类的话会自动继承父类的所有方法
     * ServletRequest是顶层接口,里面定义了getParameter方法,而HttpServletRequestWrapper是第一个实现该接口
     * 所有方法的类,所以直接继承该类重写方法就行了
     */
    private HttpServletRequest request;
    public SuperHttpServletRequest(HttpServletRequest request) {
        super(request);
        //将父类中的request赋值给该类中的request
        this.request=request;
    }

    @Override
    public String getParameter(String name) {
        //获取请求方式
        String method = request.getMethod();
        //如果是get请求,get请求的解决中文乱码的方式是用utf-8重构字符串
        if("get".equalsIgnoreCase(method)) {
            String parameter = super.getParameter(name);
            try {
                parameter = new String(parameter.getBytes("ISO-8859-1"),"utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return parameter;
            //如果是post请求,post请求解决中文乱码的方式是重新设置字符缓冲区的编码格式
        }else if("post".equalsIgnoreCase(method)) {
            try {
                request.setCharacterEncoding("utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return request.getParameter(name);
    }
}

 

posted @ 2018-02-25 00:04  Shuu_丶  阅读(203)  评论(0编辑  收藏  举报