• 过滤器( 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方法中都写上上述的解决编码代码?这时候我们就可以通过过滤器来解决了。

  • 相关阅读:
    CentOS7 离线安装fastDFS、jdk1.8、mysql5.7、nginx、libreOffice
    java生成随机验证码
    Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    js获取本地IP
    CentOS6.5下Oracle11.2安装
    IE浏览器不兼容indexOf问题
    有关LocalAlloc,LocalReAlloc,LocalFree,GlobalAlloc,GlobalReAlloc,GlobalFree的模糊点总结
    03UseTls
    03EventDemo
    lockFunctionDemo
  • 原文地址:https://www.cnblogs.com/yorkyang/p/11194740.html
Copyright © 2020-2023  润新知