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 的形式存在这个临时目录下。