zoukankan      html  css  js  c++  java
  • 过滤器( filter )的使用

    转自:https://www.jianshu.com/p/2ea2b0e4d1f2

    过滤器通常 在 web 服务端用的比较多,有要功能

    • 在客户端的请求访问后端资源之前,拦截这些请求。
    • 在服务器的响应发送回客户端之前,处理这些响应。

    过滤器的应用场景

    1.执行目标资源之前做"预处理"工作,例如设置编码,这种通常都会放行,只是在目标资源执行之前做一些准备工作。(例如:几乎是所有的Servlet中都需要写request.setCharacteEncoding(),可以把它放入到一个Filter中。)这种过滤器没有拦截功能。

    2.通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户IP是否已经被禁用。(有拦截操作) (粗粒度权限控制,会员有会员的权利、游客有游客的权利)

    3.在目标资源执行后,做一些后续的特殊处理工作。例如把目标资源输出的数据进行处理。

    案例1:分IP统计网站的访问次数

    功能分析:
      1.统计工作需要在所有资源之前都执行,那么就可以放到Filter中了。
      2.我们这个过滤器不打算做拦截操作,因为我们只是用来做统计的。
      3.用什么东西来装载统计的数据。Map<String ,Integer>,整个网站只需要一个Map即可
      4.Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并保存到SevletContext中),
        Map保存到哪里:Map需要在Filter中用来保存数据;Map需要在页面使用,打印Map中的数据

    案例2:解决全站字符乱码问题

      一般我们通过jsp页面请求转发到servlet时,若请求方式为POST且请求参数包含中文参数时,我们需要在servlet的doPost()方法中设置POST请求编码问题:request.setCharacterEncoding("utf-8");设置响应编码问题:response.setContentType("text/html;charset=utf-8");

    这样便可以解决post请求即响应编码问题;而对于GET请求,若传递的请求参数包含中文参数时设置请求编码就比较麻烦,需要在servlet的doGet()方法中设置响应编码:response.setContentType("text/html;charset=utf-8");以及请求编码:首先获得传递给servlet的请求参数:String username=request.getParameter("username")假设传递的请求参数为username,然后再输入代码username=new String(username.getBytes("ISO8859-1"),"utf-8");,这样通过jsp页面转发到servlet的参数便解决了编码问题。即可以通过response.getWrite().prinltn(username)正常显示在网页上。

    试想:以后的开发中往往会用到很多的servlet,那我们岂不是要在每一个servlet的doPost()和doGet方法中都写上上述的解决编码代码?这时候我们就可以通过过滤器来解决了。

  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/yorkyang/p/11194740.html
Copyright © 2011-2022 走看看