1. 程式人生 > 其它 >HttpSessionActivationListener下的對序列化介面的鈍化和活化

HttpSessionActivationListener下的對序列化介面的鈍化和活化

HttpSessionActivationListener下的對序列化介面的鈍化和活化

sessionWillPassivate鈍化是指將Serializable介面經常檔案儲存到磁碟

sessionDidActivate活化是指將生成的檔案讀取到session域中進行使用,

說明:原本session可以保護使用者7天的免密登入;然後鈍化使得伺服器重啟也能儲存使用者資料

package com.msb;

import org.apache.jasper.tagplugins.jstl.core.Out;
//從位址列讀取資料給到user,然後設定到session域中進行保留
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
@WebServlet(urlPatterns = "/Servlet.do")
public class Servlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        User user = new User(username,password);
        //這裡一定一定是session
        session.setAttribute("user",user);
        //這裡listener只是為了呼叫鈍化活化hascode,做顯示使用
        session.setAttribute("listener",new MySessionActivationListener());
    }
}

package com.msb;
//實體類user
import java.io.Serializable;

public class User implements Serializable {
    private String username;
    private String password;

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
}

package com.msb;
//鈍化讀取
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;

public class MySessionActivationListener implements HttpSessionActivationListener , Serializable {
    public void sessionWillPassivate(HttpSessionEvent se) {
        //鈍化將Serializable存入磁碟
        System.out.println(se.getSession().hashCode()+"已經鈍化");

    }

    public void sessionDidActivate(HttpSessionEvent se) {
        //活化讀取Serializable
        System.out.println(se.getSession().hashCode()+"已經活化");
    }
}

package com.msb;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(urlPatterns = "/userChicker.do")
public class UserChicker extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //獲取user
        HttpSession session = req.getSession();
        //對前面放入session的資料進行讀取
        Object attribute = session.getAttribute("user");
        //listener後面鈍化活化監聽器使用
        Object listener = session.getAttribute("listener");
        String message ="";
        //判斷是否第一次登入,此使用者
        if(null != attribute){
            message="您已經登入過";
        }else{
            message="您還未登入";
        }
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().println(message);
    }
}

<%--
  Created by IntelliJ IDEA.
  User: tomel
  Date: 2022/5/30
  Time: 10:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="Servlet.do" method="post">
    賬號:<input name="username" type="text"><br/>
    密碼:<input name="password" type="password"><br/>
    <input value="提交" type="submit">
</form>
</body>
</html>

鈍化建立(無格式)檔案Context.xml:這裡將鈍化檔案建立到d盤

<?xml version="1.0" encoding="UTF-8"?>

<Context>

    <Manager className="org.apache.catalina.session.PersistentManager">

        <Store className="org.apache.catalina.session.FileStore" directory="d:/session"/>

    </Manager>

</Context>