码迷,mamicode.com
首页 > 其他好文 > 详细

过滤器Filter

时间:2018-05-21 16:58:31      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:char   str   catch   byte   不同   tst   配置文件   character   turn   

Filter就像一个一个哨卡,用户的请求需要经过Filter,
并且可以有多个过滤器

利用过滤器我们可以实现例如自动登录、解决中文乱码问题等。

1.编写Filter:实现Filter接口,重写方法

public class MyFilter implements Filter {

    public void destroy() {
        System.out.println("过滤器销毁");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest hrequest = (HttpServletRequest)request;
        HttpServletResponse hresponse = (HttpServletResponse)response;
        hrequest.setCharacterEncoding("utf-8");
        hresponse.setContentType("text/html;charset=utf-8");
        System.out.println("过滤器执行");
        //放行
        chain.doFilter(request, response);
        //filter执行按照配置顺序来进行
    }

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

}

这里要注意chain.doFilter,执行后即意味着当前过滤器放行,执行下一个过滤器

2.XML配置:

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

配置方式和Servlet类似,不同的是过滤器的执行顺序是按照配置文件的先后执行,即在配置文件上方的先被执行。

3.应用

解决中文乱码问题

/**
 * 装饰者:
 * 1.增强类与被增强类实现统一接口
 * 2.增强类中传入被增强类
 * 3.重写需要增强的方法
 * */
class EnhancedRequest extends HttpServletRequestWrapper{
    private HttpServletRequest request;
    public EnhancedRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
    //getParameter重写
    @Override
    public String getParameter(String name) {
        String parameter = request.getParameter(name);
        try {
            parameter=new String(parameter.getBytes("iso8859-1"),"utf-8");//转码
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return parameter;
    }
    
}
public class CNFilter implements Filter {

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

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse rep = (HttpServletResponse) response;
        //增强类对象
        EnhancedRequest enhancedRequest = new EnhancedRequest(req);
        rep.setContentType("text/html;charset=utf-8");//设置响应编码
        chain.doFilter(enhancedRequest, rep);
    }

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

}

 

过滤器Filter

标签:char   str   catch   byte   不同   tst   配置文件   character   turn   

原文地址:https://www.cnblogs.com/whwjava/p/9067955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!