zoukankan      html  css  js  c++  java
  • 分析logfilter+session

    1.P132分析:

    long before = System.currentTimeMillis();

    //返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。而且可以用这个值来构造一个Date对象。

    HttpServletRequest hrequest = (HttpServletRequest)request;

    //HttpServletRequest接口是ServletRequest子接口,HttpServletRequest接口遵循http协议。将ServletRequest请求转换为HttpServletRequest请求。

    System.out.println("Filter已经截获到用户的请求的地址: " +hrequest.getServletPath());

    //输出提示信息,通过getServletPath()方法获取请求的路径,在日志中记录请求的url。(不完整的url形式输出)

    long after = system.currentTimeMillis();

    //返回当前的计算机时间,标记结束时间,和前面的before构成范围,计算过滤所需时间。

    2.用filter做用户授权的例子(代码积累):

    用Filter防止用户访问一些未被授权的资源,比如一个用户未登录就不允许访问网站的某些页面,并将页面重定向到需要用户登录的页面,下面是一个相关的例子:

    package com.drp.util.filter; 
    
    import java.io.IOException; 
    
    import javax.servlet.Filter; 
    import javax.servlet.FilterChain; 
    import javax.servlet.FilterConfig; 
    import javax.servlet.ServletException; 
    import javax.servlet.ServletRequest; 
    import javax.servlet.ServletResponse; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import javax.servlet.http.HttpSession; 
    
    public class AuthFilter implements Filter {
    
    public void destroy() {
    
    }
    
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
    FilterChain filterChain) throws IOException, ServletException {
    /** 1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括
    *   表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过
    *   滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
    */
    
    HttpServletRequest request = (HttpServletRequest)servletRequest; 
    /** 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中
    *   无法得到的方法,就要把此request对象构造成HttpServletRequest
    */
    HttpServletResponse response = (HttpServletResponse)servletResponse;
    
    String currentURL = request.getRequestURI(); //取得根目录所对应的绝对路径:
    
    String targetURL = currentURL.substring(currentURL.indexOf("/", 1), 
    currentURL.length()); //截取到当前文件名用于比较
    
    HttpSession session = request.getSession(false); 
    
    if (!"/login.jsp".equals(targetURL)) {
    //判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
    if (session == null || session.getAttribute("user") == null) {
    //*用户登录以后需手动添加session
    System.out.println("request.getContextPath()=" + request.getContextPath()); 
    response.sendRedirect(request.getContextPath() + "/login.jsp"); 
    //如果session为空表示用户没有登录就重定向到login.jsp页面
    return; 
    }
    }
    //加入filter链继续向下执行
    filterChain.doFilter(request, response); 
    /**  调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作
    *    为它 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另
    *    一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
    */
    }
    
    public void init(FilterConfig filterConfig) throws ServletException {
    
    }
    }

    3.session:

    ①session是什么:中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息。当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案,有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session,当用户登录后,需要把用户信息保存到session中,便于确保用户操作权限,在其它页面通过检查session是否为null可以知道用户是否登录。

    ②session的使用:使用request对象获取session,然后进行操作:(1)引入包servlet-api.jar;(2)使用request获取session:HttpSession session = request.getSession();(3)对session的操作:

    session.setAttribute("key", value); 
    session.getAttribute("key"); 
    session.removeAttribute("key"); 
    session.invalidate(); //删除所有session中保存的键

    ③怎样管理:session管理,有四种方法:

    (1)session复制:需要专门的同步进程, 同步集群中的应用服务器对象。这种方法比较简单, 从本地读取session也比较快,但是集群较大时, 会占用较多服务器和网络资源。

    (2)session绑定:通过负载均衡的源地址hash算法, 将源ip的请求,总是发送到固定的应用服务器。但是, 这种方法不能满足系统高可用, 如果一台应用服务器宕机之后, 用户转发到其它应用服务器时, 其session将丢失。

    (3)cookie记录session:cookie方式将session信息保存在客户端,这种方式虽然简单易用且能降低应用服务器负载,但是缺点较多:受cookie大小限制;需要客户端浏览器支持cookie;每次请求需要传递cookie,增加网络负担;安全性问题。

    (4) session服务器:采用独立服务器, 使用文件、数据库或缓存系统来管理session, 实现session在应用服务器间的共享。 这种方式满足可伸缩(可集群化)、高可用(建立session服务器集群),性能也不错。

  • 相关阅读:
    Educational Codeforces Round 10 C. Foe Pairs 水题
    Educational Codeforces Round 10 B. z-sort 构造
    CDOJ 1048 Bob's vector 三分
    Educational Codeforces Round 10 A. Gabriel and Caterpillar 模拟
    第14届电子科大初赛民间盗版部分题目题解
    HDU 5654 xiaoxin and his watermelon candy 离线树状数组 区间不同数的个数
    HDU 5653 Bomber Man wants to bomb an Array. dp
    HDU 5652 India and China Origins 二分+并查集
    HDU 5651 xiaoxin juju needs help 数学
    HDU 5650 so easy 数学
  • 原文地址:https://www.cnblogs.com/gai-blog/p/8649396.html
Copyright © 2011-2022 走看看