前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

Filter

作者头像
晚上没宵夜
发布2020-03-10 09:14:29
9540
发布2020-03-10 09:14:29
举报
文章被收录于专栏:Howl同学的学习笔记

1. Filter 过滤器

过滤器是实现了Filter接口的一个java类,是Servlet的高级应用,可以处理request和response,该接口有下面三种方法

代码语言:javascript
复制
public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
}

public void init(FilterConfig filterConfig) throws ServletException {
}

工作区间

2. 操作流程

2.1 实现Filter接口

代码语言:javascript
复制
// 注解配置(@WebFilter(filterName="FilterTest",urlPatterns="/*"))
// 但我这里用xml配置
public class FilterTest implements Filter {

public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    
    //需要执行的逻辑代码在这里
    System.out.println("我是首个Filter");
    
    //表示放行
    chain.doFilter(request, response);

    // 表示处理Response
    System.out.println("处理响应的地方");
}

public void init(FilterConfig filterConfig) throws ServletException {
}

2.2 web.xml配置

代码语言:javascript
复制
<filter>
    <filter-name>FilterTest</filter-name>
    <filter-class>filter.FilterTest</filter-class>
</filter>
<filter-mapping>
    <filter-name>FilterTest</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • xml配置的顺序就是Filter的执行顺序,而注解方式是通过匹配地址的自然顺序执行的,这是注解的一个遗憾**
  • 其中chain.doFilter表示放行,配置多个过滤器时会把这些过滤器放到FilterChain里,调用它就会带上request,和response,自动执行下一个过滤器**
  • 这样的调用属于链式调用,类似于递归,调用完后还会回到该函数继续执行下面的代码**
  • chain.doFilter如果没有下一个过滤器就访问资源**

使用了责任链模式,具体请看这里 责任链模式(使用Filter来举例)

3. 作用

3.1 过滤POST乱码

代码语言:javascript
复制
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    
    //ServletRequest功能不够强大,需要强转成HttpSerlvet
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    
    //设置编码
    httpServletRequest.setCharacterEncoding("UTF-8");
    httpServletResponse.setContentType("text/html;charset=UTF-8");
    
    //表示放行
    chain.doFilter(request, response);
}

3.2 过滤Get乱码(使用到了 装饰者模式)

装饰类

代码语言:javascript
复制
class MyRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;

    public MyRequest(HttpServletRequest request) {
        this.request = request;
    }

    public String getParameter(String name) {
        String value = this.request.getParameter(name);

        if (value == null) {
            return null;
        }

        //如果不是get方法的,直接返回就行了
        if (!this.request.getMethod().equalsIgnoreCase("get")) {
            return null;
        }

        try {

            //进来了就说明是get方法,把乱码的数据
            value = new String(value.getBytes("ISO8859-1"), this.request.getCharacterEncoding());
            return value ;

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();

            throw new RuntimeException("不支持该编码");
        }
    }
}

实现

代码语言:javascript
复制
MyRequest myRequest = new MyRequest(httpServletRequest);
//装饰增加新功能

3.3 还有敏感字过滤,权限验证等

4. FilterConfig

Filter也有FilterConfig这个对象,来获取里面的初始化参数,至此我们可以知道,获取xml配置初始化参数有Config这个对象

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. Filter 过滤器
  • 2. 操作流程
    • 2.1 实现Filter接口
      • 2.2 web.xml配置
      • 3. 作用
        • 3.1 过滤POST乱码
          • 3.2 过滤Get乱码(使用到了 装饰者模式)
            • 3.3 还有敏感字过滤,权限验证等
            • 4. FilterConfig
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档