Filter高级开发-增强request

2017-10-31  本文已影响35人  小小蒜头

由于开发人员在Filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求。

过滤器:CharacterEncodingFilter2.java

package cn.itcast.filter;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * Created by yvettee on 2017/10/31.
 */
//真正解决全站乱码问题
public class CharacterEncodingFilter2 implements Filter {
    private FilterConfig config;
    private String defaultConfig = "UTF-8";//定义一个缺省的字符集

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String charset = this.config.getInitParameter("charset");
        if (charset == null) {
            charset = defaultConfig;
        }

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        request.setCharacterEncoding(charset);
        response.setCharacterEncoding(charset);
        response.setContentType("text/html;charset = " + charset);

        filterChain.doFilter(new MyRequest(request), response);
    }

    /*
    1.写一个类,实现与被增强对象相同的接口
    2.定义一个变量,记住被增强对象
    3.定义一个构造方法,接收被增强对象
    4.覆盖想增强的方法
    5.对于不想增强的方法,直接调用被增强对象(目标对象)的方法
     */

    //编写自定义类
    class MyRequest extends HttpServletRequestWrapper {

        private HttpServletRequest request;

        public MyRequest(HttpServletRequest request) {
            //传一个被增强对象request进去
            super(request);
            this.request = request;
        }

        // 覆盖需要增强的getParameter方法
        @Override
        public String getParameter(String name) {
            String value = request.getParameter(name);
            if (!request.getMethod().equalsIgnoreCase("get")) {
                return value;
            }
            if (value == null) {
                return null;
            }
            try {
                return value = new String(value.getBytes("iso8859-1"), request.getCharacterEncoding());
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }
    }

    @Override
    public void destroy() {

    }
}

web.xml

 <filter>
        <filter-name>CharacterEncodingFilter2</filter-name>
        <filter-class>cn.itcast.filter.CharacterEncodingFilter2</filter-class>
        <init-param>
            <param-name>charset</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

源代码:https://github.com/yvettee36/FilterBase
上篇:Filter案例四—实现用户自动登录的过滤器
下篇:转义Filter

上一篇下一篇

猜你喜欢

热点阅读