zoukankan      html  css  js  c++  java
  • JAVAEE第三周

    2、背景:看到Session时,感到很熟悉,毕竟涉及到过类似的编程,用得最多的地点就是保存客户端的信息和记录,比如说你已经登陆过某个网站,下次访问时不想要麻烦的重新登陆你就就可以使用这个机制。Session与Cookie是对好兄弟,Session与Cookie都是解决Http协议的无状态问题,Cookie数据存储在客户端的浏览器内存中或本地缓存文件中,Session数据存储在服务器端的内存中。

    Cookie数据存储安全性较低,Session数据存储安全性较高。Session数据存储在服务器端内存中,访问增多时,降低服务器端性能。而Cookie则不会对服务器端性能造成影响。
    单个Cookie存储的数据最大是4KB,一个网站只能存储20个Cookie。Session则没有这个问题。Session在关闭浏览器时失效,而持久Cookie则可以存储更长有效时间。总的来说,Session与Cookie各有优势,不能简单来说谁更优。具体用法要考虑具体案例情况而定

    cookie:(注意保密哟,不然会被盗用)

    Burp抓的SessionId

    Session概述
    Session一般译为会话,是解决Http协议的无状态问题的方案,可以将一次会话中的数据存储在服务器端的内存中,保证在下一次的会话中可以使用。

    在客户端浏览器第一次向服务器端发送请求时,服务器端会为这个客户端创建独有的Session,并具有唯一的Session ID,存储在服务器端的内存中。在客户端第二次访问服务器端时,会携带Session ID在请求中,服务器端会根据Session ID查找对应的Session信息,进行进一步地操作。

    在JavaEE中提供了javax.servlet.http.HttpSession接口,通过该接口可以将共享的数据内容存储在HttpSession对象中,从而解决Http协议的无状态问题。

    在JavaEE提供的javax.servlet.http.HttpSession接口,是Web应用程序开发使用Session的接口,该接口提供了很多API方法,而常用的方法有以下几个:

    • 创建一个Servlet用于向HttpSession对象中存储共享数据内容。
     
    public class FirstServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            HttpSession session = request.getSession();
            session.setAttribute("name", "longestory");
            System.out.println("已经成功向HttpSession对象中存储了共享数据内容name=longestory...");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
     
    • 创建另一个Servlet用于从HttpSession对象中获取储存的共享数据内容。
     
    public class SecondServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            
            HttpSession session = request.getSession();
            String name = (String)session.getAttribute("name");
            
            out.println("<h1>你存储的共享数据内容为name="+name+"</h1>");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
     
    • 配置Web工程的web.xml文件。
     
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>
      <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>app.java.session.FirstServlet</servlet-class>
      </servlet>
      <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>app.java.session.SecondServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/first</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/second</url-pattern>
      </servlet-mapping>    
    </web-app>
    复制代码

     logfiler分析

    Filter也可以日志记录,在request 之前后, 该filter 使用Apache 日只记录工具,记录客户IP ,访问URI 以及消耗时间。

    LogFilter.java

    复制代码
    package com.helloweenvsfei.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 org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    public class LogFilter implements Filter {
    
        private Log log = LogFactory.getLog(this.getClass());
    
        private String filterName;
    
        public void init(FilterConfig config) throws ServletException {
    
            // 获取 Filter 的 name,配置在 web.xml 中
            filterName = config.getFilterName();
    
            log.info("启动 Filter: " + filterName);
    
        }
    
        public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException {
    
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
    
            long startTime = System.currentTimeMillis();
            String requestURI = request.getRequestURI();
    
            requestURI = request.getQueryString() == null ? requestURI
                    : (requestURI + "?" + request.getQueryString());
    
            chain.doFilter(request, response);
    
            long endTime = System.currentTimeMillis();
    
            log.info(request.getRemoteAddr() + " 访问了 " + requestURI + ", 总用时 "
                    + (endTime - startTime) + " 毫秒。");
    
        }
    
        public void destroy() {
            log.info("关闭 Filter: " + filterName);
        }
    
    }
    复制代码

    log4j.properties   使用jar log4j.jar 和 commons-logging.jar

    可参考

     

    log4j.rootLogger=INFO, A1
    
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%l]-[%p] %m%n

    web.xml

    复制代码
    <filter>
        <filter-name>logFilter</filter-name>
        <filter-class>com.helloweenvsfei.filter.LogFilter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>logFilter</filter-name>
        <url-pattern>/*</url-pattern>
  • 相关阅读:
    实用Javascript调试技巧
    fetch的常见问题及其解决办法
    为什么重复的GET请求变慢了?
    JavaScript深入浅出第4课:V8引擎是如何工作的?
    一步一步搭建前端监控系统:如何定位前端线上问题?
    如何使用 Set 来提高JS代码的性能
    详解Vue的slot新用法
    详解Vue响应式原理
    BeautyWe.js 一套专注于微信小程序的开发范式
    await Task.Yield()和await Task.CompletedTask有什么不同
  • 原文地址:https://www.cnblogs.com/csdns/p/8608423.html
Copyright © 2011-2022 走看看