JAVAEE第三周

时间:2023-03-08 17:58:04
JAVAEE第三周

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

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

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

JAVAEE第三周

Burp抓的SessionId

JAVAEE第三周

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方法,而常用的方法有以下几个:

JAVAEE第三周

  • 创建一个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>
JAVAEE第三周

logfiler分析

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

LogFilter.java

JAVAEE第三周
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);
} }
JAVAEE第三周

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

JAVAEE第三周
<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>