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>
 posted on 2018-03-20 11:54  Warning('line4')  阅读(155)  评论(0编辑  收藏  举报