• 分析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服务器集群),性能也不错。

  • 相关阅读:
    Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码
    Docker Compose部署项目到容器-基于Tomcat和mysql的商城项目(附源码和sql下载)
    Winform中在FastReport的PreviewControl预览控件中对report控件模板中控件值进行修改
    Winform将FastReport的report与PreviewControl建立绑定关系
    Winform中使用FastReport实现自定义PDF打印预览
    Winform中使用FastReport实现简单的自定义PDF导出
    Docker Compose基本使用-使用Compose启动Tomcat为例
    Docker-Compose简介与Ubuntu Server 上安装Compose
    FastReport安装包下载、安装、去除使用限制以及工具箱中添加控件
    一个程序员的自白(乱中有序)
  • 原文地址:https://www.cnblogs.com/gai-blog/p/8649396.html
Copyright © 2020-2023  润新知