zoukankan      html  css  js  c++  java
  • 对Filter和Session的理解与学习

    Filter简介:

      Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

    doFilter方法:  

      Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

      调用目标资源之前,让一段代码执行。
      是否调用目标资源(即是否让用户访问web资源)。
      调用目标资源之后,让一段代码执行。
      web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个
    doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,
    否则web资源不会被访问。

      在doFilter()方法中,chain.doFilter()前的一般是对request执行的过滤操作,chain.doFilter后面的代码一般是对response执行的操作。

      

      Filter接口中最重要的方法doFilter是传递请求,响应和过滤器链对象。该方法可以执行以下操作。

      检查request headers。

      如果希望过滤器修改request headers或data,请自定义请求对象。

      如果希望过滤器修改 response headers或data,则自定义响应对象。

      调用过滤器链中的下一个实体。如果当前过滤器是以目标Web组件或静态资源结尾的链中的最后一个过滤器,则下一个实体是链末尾的资源; 否则,它是WAR中配置的下一个过滤器。过滤器通过调用doFilter链对象上的方法调用下一个实体,传入请求和响应。

      或者,过滤器可以选择通过不调用下一个实体来阻止请求。在后一种情况下,过滤器负责填写响应。在调用链中的下一个过滤器后检查 response headers。抛出异常以指示处理中的错误。

      除此之外doFilter,你必须实现initdestroy 方法

      

    @WebFilter(filterName="log"
        ,urlPatterns={"/*"})//filterName指定该Filter的名称,urlPatterns指定该Filter所拦截的URL
      public class LogFilter implements Filter
      {
        //FilterConfig可用于访问Filter的配置信息
        private FilterConfig config;
        //实现初始化方法
        public void init(FilterConfig config)
        {
          this.config = config;
        }
        //实现销毁方法
        public void destroy()
        {  
        this.config = null;
        }
        //执行过滤的核心方法
        public void doFilter(ServletRequest request,
          ServletResponse response, FilterChain chain)//此方法的最后一个参数是FilterChain对象,此参数是用来调用servlet或JSP页。
          throws IOException,ServletException
         {
            //---------下面代码用于对用户请求执行预处理---------
            //获取ServletContext对象,用于记录日志
            ServletContext context = this.config.getServletContext();
            long before = System.currentTimeMillis();
            System.out.println("开始过滤...");
            //将请求转换成HttpServletRequest请求
            HttpServletRequest hrequest = (HttpServletRequest)request;
            //输出提示信息
            System.out.println("Filter已经截获到用户的请求的地址: " +
              hrequest.getServletPath());
            //Filter只是链式处理,请求依然放行到目的地址
            chain.doFilter(request, response);
            //---------下面代码用于对服务器响应执行后处理---------
            long after = System.currentTimeMillis();
            //输出提示信息
            System.out.println("过滤结束");
            //输出提示信息
            System.out.println("请求被定位到" + hrequest.getRequestURI() +
                " 所花的时间为: " + (after - before));
          }  
        }

    Session:

      在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

      每次我们访问一个页面,如果有开启session,也就是有session_start() 时,就会自动生成一个session_id 来标注是这次会话的唯一ID,同时也会自动往cookie里写入一个名字为PHPSESSID的变量,它的值正是session_id,当这次会话没结束,再次访问的时候,服务器会去读取这个cookie是否有值有没过期,如果能够读取到,则继续用这个session_id,如果没有,就会新生成一个session_id,同时生成cookie。由于默认生成的这个cookie是会话,也就是说关闭浏览器就会过期掉,所以,下次重新浏览时,会重新生成一个session_id。
      这个是session_id,就用来标识绑定一个用户的,既然session_id生成了。那么当我们往session里面写入数据,那么它是怎么存的呢?
     同样也是用到session_id。session_id是32位的,服务器会用 sess_前缀 + session_id 的形式存在这个临时目录下。
  • 相关阅读:
    OBJC依赖库管理利器cocoapods 安装及使用详细图解
    OBJC依赖库管理利器cocoapods 安装及使用详细图解
    Parse-轻松构建移动APP的后台服务
    Parse-轻松构建移动APP的后台服务
    Parse:App开发必备 让应用开发效率提高上百倍
    Responder对象
    Responder对象
    iOS UIWebView获取403/404
    Python基本语法_基本数据类型_数值型详解
    Openstack贡献者须知 — OpenPGP/SSH/CLA贡献者协议
  • 原文地址:https://www.cnblogs.com/qiangzai/p/8675262.html
Copyright © 2011-2022 走看看