zoukankan      html  css  js  c++  java
  • Filter过滤器

    关键操作:配置以及放行

    Day 1

    从例子引入

    输入张三

    后台输出数据为中文乱码

    解决方法

       req.setCharacterEncoding("UTF-8");

    然而这个只能解决一个页面的,如果有很多个页面要用很多次

    要避免重复代码

    用过滤器去处理

    过滤器Filter

    一.功能:
    1、⽤来拦截传⼊的请求和传出的响应。
    2、修改或以某种⽅式处理正在客户端和服务端之间交换的数据流。
    二.如何使⽤?
    与使⽤ Servlet 类似,Filter 是 Java WEB 提供的⼀个接⼝,开发者只需要⾃定义⼀个类并且实现该接⼝

    注意引 javax 的包

     代码

    (处理中文乱码)

    public class CharacterFilter implements Filter {
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse
    servletResponse, FilterChain filterChain) throws IOException, ServletException
    {
     servletRequest.setCharacterEncoding("UTF-8");
     filterChain.doFilter(servletRequest,servletResponse);
     }}

     在web.xml中配置

    注意:doFilter ⽅法中处理完业务逻辑之后,必须添加
    fifilterChain.doFilter(servletRequest,servletResponse);//相当于放行
    否则请求/响应⽆法向后传递,⼀直停留在过滤器中。
        <filter>
            <filter-name>character</filter-name>
            <filter-class>com.filter.ChracterFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>character</filter-name>
            <url-pattern>/login</url-pattern>//要让啥页面过滤,就配它
    <url-pattern>/test</url-pattern> </filter-mapping>

     配了之后访问,结果名字都没输出出来

    原因:

    过滤器将请求暂停了,需要放行

    解决方法

    filterServlet中加一行

      filterChain.doFilter(servletRequest,servletResponse);

    结果:

     有中文输出了

    (Day 2)Filter的生命周期

    (联系Servlet)

    当 Tomcat 启动时,通过反射机制调⽤ Filter 的⽆参构造函数创建实例化对象,同时调⽤ init ⽅法实现
    初始化,doFilter ⽅法调⽤多次,当 Tomcat 服务关闭的时候,调⽤ destory 来销毁 Filter 对象。
    ⽆参构造函数:只调⽤⼀次,当 Tomcat 启动时调⽤(Filter ⼀定要进⾏配置
    init ⽅法:只调⽤⼀次,当 Filter 的实例化对象创建完成之后调⽤
    doFilter:调⽤多次,访问 Filter 的业务逻辑都写在 Filter 中
    destory:只调⽤⼀次,Tomcat关闭时调用

      配置

    顺序要求:用web.xml

    同时配置多个 Filter,Filter 的调⽤顺序是由 web.xml 中的配置顺序来决定的,写在上⾯的配置先调⽤,因为 web.xml 是从上到下顺序读取的。
    顺序要求:
    @WebFilter("/download.jsp")

    和servlet配置类似

    实际开发中 Filter 的使⽤场景:
    1、统⼀处理中⽂乱码。(Day1)
    2、屏蔽敏感词。
    3、控制资源的访问权限。
     
    2.
     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
           //将 敏感词  替换成  ***
            servletRequest.setCharacterEncoding("UTF-8");
            String name=servletRequest.getParameter("name");
    
            name=name.replaceAll("敏感词","***");
            filterChain.doFilter(servletRequest,servletResponse);
        }

    结果:

    在TestServlet中访问,name仍然没改

     原因:黄色行改的是副本

    如何存回去

            servletRequest.setAttribute("name",name);
            servletRequest.getAttribute("name",name);

    用这个方法

    3.

    控制资源访问

    思路:该过滤器实现通过session里有无信息判断用户是否登录,若登录,则放行,若未登录就跳转到登录界面

    @WebFilter("/download.jsp")  //待放行页面
    public class DownloadFilter implements Filter {
     @Override
     public void doFilter(ServletRequest servletRequest, ServletResponse
    servletResponse, FilterChain filterChain) throws IOException, ServletException
    {
     HttpServletRequest request = (HttpServletRequest) servletRequest;
     HttpServletResponse response = (HttpServletResponse) servletResponse;   //下转了才能用session
     HttpSession session = request.getSession();
     String name = (String) session.getAttribute("name");
     if(name == null){
     //不是登录状态
     response.sendRedirect("/login.jsp");
     }else{
     filterChain.doFilter(servletRequest,servletResponse);  //是登录状态,则放行
     }
     }
    }
  • 相关阅读:
    键盘过滤驱动
    多线程和多进程的差别(小结)
    Android UI设计规则
    怎样使用SetTimer MFC 够具体
    Chord算法(原理)
    POJ 1384 Piggy-Bank 背包DP
    Bulk Insert命令具体
    hibernate官方新手教程 (转载)
    教你用笔记本破解无线路由器password
    转换流--OutputStreamWriter类与InputStreamReader类
  • 原文地址:https://www.cnblogs.com/hanabi-521/p/14338420.html
Copyright © 2011-2022 走看看