zoukankan      html  css  js  c++  java
  • Javaweb之Filter学习笔记

    Filter 过滤器
    1、JavaWeb三大组件之一。三大组件分别为:servlet程序、Listener接口、Filter过滤器
    2、Filter过滤器是JavaEE规范,也就是接口
    3、Filter过滤器作用是:拦截请求、过滤响应。

    拦截请求常见应用场景:
    1、权限请求
    2、日记管理
    3、事物管理
    ……等等

    Filter初体验:
    要求在web工程目录下,有一个admin目录。这个目录的资源(html,css,js,jsp,jpg……)都必须是用户登录后才允许访问。

    <%
    Object user = session.getAttribute("user");
    // if user == null ,user not login
    if(user == null){
    request.getRequestDispatcher("/login.jsp").forward(request,response);
    return;
    }
    %>
    这个方法有局限性,只能在jsp页面中使用;

    Filter原理:
    客户端发送请求(http://ip:port/资源路径)


    服务器:

    Filter过滤器:
    在访问目标资源之前:
    检查用户权限:有权限,直接放行(程序默认执行)
    无权限:返回客户端(或者跳转到权限授予页面)

    目标资源:
    html页面,jsp页面,Servlet程序,txt文本,jpg图片,mp4视频……等等。

    例子:
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;

    public class AdminFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
    * doFilter方法,专门用于拦截请求,可以做权限检查
    * @param servletRequest
    * @param servletResponse
    * @param filterChain
    * @throws IOException
    * @throws ServletException
    */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;

    HttpSession session = httpServletRequest.getSession();
    Object user = session.getAttribute("user");
    // If user == null,user no login
    if(user == null){
    servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
    return;
    }else {
    // 让程序继续往下访问用户的目标资源
    filterChain.doFilter(servletRequest, servletResponse);
    }
    }

    @Override
    public void destroy() {

    }

    }

    web.xml配置:
    <!-- <filter></filter> 用于配置一个Filter过滤器-->

    <filter>
    <!-- 给Filter起一个名称-->
    <filter-name>AdiminFilter</filter-name>
    <!-- 配置FIlter的全类名-->
    <filter-class>AdiminFilter</filter-class>
    </filter>
    <!-- 配置filter过滤器的拦截路径-->
    <filter-mapping>
    <!-- 表示当前的拦截路径给哪个filter使用-->
    <filter-name>AdiminFilter</filter-name>
    <!-- 配置拦截路径,表示请求地址为:http://ip:port/工程路径/ 映射web目录-->
    <!-- /admin/* 表示请求地址为:http://ip:port/工程路径/admin/*-->
    <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

    Filter过滤器的使用步骤:
    1、编写一个类去实现Filter接口
    2、实现过滤方法doFilter()
    3、到web.xml中去配置Filter的拦截路径



    Filter生命周期:

    Filter的生命周期包含的几个方法:
    1、构造器方法
    2、init初始化方法
    第1、2步,web工程启动方式就会执行
    3、doFilter过滤方法
    拦截到请求时就会执行
    4、destroy销毁
    web工程停止时就会执行(停止web工程,会销毁Filter过滤器)


    FilterConfig类

    FilterConfig类,是Filter过滤器的配置文件。
    Tomcat每次创建是,都会创建一个FilterConfig类,这里包含类Filter配置文件的配置信息。

    FilterConfig类的作用是获取Filter过滤器的配置内容。
    1、获取Filter的名称filter-name的内容
    2、获取在Filter中配置的init-param初始化参数
    3、获取servletContext对象

    FilterChain过滤器链(多个filter执行时,他们的顺序是由它们在web.xml中配置的(从上到下)顺序决定);
    filter:过滤,
    chain:链条,
    filterchain:就是过滤器链(多个过滤器如何一起工作)

    客户端(浏览器):
    htpp://ip:port/工程路径/资源
    得到返回的数据

    服务器(Tomcat)
    配置web.xml时,需要将多个filter的访问路径配置为相同
    Filter1:
    doFilter(){
    前置代码1
    进行判断,是否有下个Filter,如果有,则跳转到下个Filter,没有继续执行目标资源;
    chain.doFilter();
    当访问到目标资源后,携带资源返回继续执行,若该Filter是由前面跳转而来,那么也要跳转回去执行它的后置代码2
    后置代码2
    }

    Filter2:
    doFilter(){
    前置代码1
    进行判断,是否有下个Filter,如果有,则跳转到下个Filter,没有继续执行目标资源;
    chain.doFilter();
    当访问到目标资源后,携带资源返回继续执行,若该Filter是由前面跳转而来,那么也要跳转回去执行它的后置代码2
    后置代码2
    }

    FilterChain.doFilter()方法的作用:
    1、执行下一个Filter过滤器(如果有)
    2、执行目标资源(没有Filter)

    目标资源:
    html页面
    jsp页面
    Servlet程序
    jpg图片
    txt文本
    mp4视频
    ……等等

    多个filter过滤器执行的特点:
    1、所有filter和目标资源都默认执行在同一个线程中
    2、多个filter共同执行的时候,他们都使用同一个request对象;


    Filter的拦截路径:
    --精确匹配:
    <url-pattern>/target.jsp</url-pattern>
    以上配置的路径,表示请求的路径必须为:http://ip:port/工程路径/target.jsp

    --目录匹配:
    <url-pattern>/admin/*</url-pattern>
    以上配置的路径,表示请求的路径必须为:http://ip:port/工程路径/admin/*

    --后缀名匹配:
    <url-pattern>*.html</url-pattern>
    以上配置的路径,表示请求的地址必须以.html结尾才会拦截到


    web.xml中Filter的配置:
    <filter>
    <filter-name>Filter2</filter-name> //别名
    <filter-class>Filter2</filter-class> //类路径
    </filter>
    <filter-mapping>
    <filter-name>Filter2</filter-name> //别名
    <url-pattern>/target.jsp</url-pattern> //请求路径匹配
    </filter-mapping>
  • 相关阅读:
    常用的SQL语句
    解决Pycharm中module 'pip' has no attribute 'main'的问题
    [转]如何使用Fiddler抓取指定浏览器的数据包
    Linux常用命令
    Android:JACK编译错误汇总及解决
    Linux学习:使用 procrank 测量系统内存使用情况
    Android:动态库(.so)调试技巧
    Android 显示系统:Vsync机制
    Android:cmake开发指南
    Android:高通平台性能调试
  • 原文地址:https://www.cnblogs.com/youlingdada-top/p/13759697.html
Copyright © 2011-2022 走看看