세션 수명 주기 및 대표적인 사례 - 관리 페이지에 대한 불법 액세스 방지

세션 생명주기 및 세션 클래식 사례 - 관리 페이지에 대한 불법 접근 방지

세션 수명 주기

세션 수명 주기 - 설명

  1. public void setMaxInactiveInterval(int interval) 세션 제한 시간(초)을 설정합니다. 지정된 시간을 초과하면 세션이 삭제됩니다.

  2. 값이 양수이면 세션 제한 시간을 설정합니다.

  3. 음수는 제한 시간이 없음을 의미합니다.

  4. public int getMaxInactiveInterval() 세션 시간 초과를 가져옵니다.

  5. public void invalidate()는 현재 세션 세션을 즉시 무효화합니다.

  6. 세션의 수명을 지정하기 위해 setMaxInactiveInterval()을 호출하지 않으면 Tomcat은 기본 세션 시간을 표준으로 사용하며 기본 세션 제한 시간은 30분이며 tomcat의 web.xml에서 설정할 수 있습니다.
    여기에 이미지 설명 삽입

  7. 세션의 수명 주기는 누적 시간이 아니라 클라이언트/브라우저의 두 요청 사이의 최대 간격을 나타냅니다. 즉, 클라이언트가 자신의 세션에 액세스하면 세션의 수명 주기가 0부터 다시 계산됩니다. (해석: 동일한 세션에서 두 요청 사이의 간격을 의미함)

  8. 하단 레이어: Tomcat은 스레드를 사용하여 세션 상태를 폴링하며 세션의 유휴 시간이 설정된 최대값을 초과하면 세션이 파괴됩니다.

코드 데모는 세션의 수명 주기를 보여줍니다.

CreateCreateSession2

public class CreateSession2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("CreateSession2 被调用");
        //创建session
        HttpSession session = request.getSession();
        System.out.println("CreateSession2 sid= " + session.getId());
        //设置生命周期为 60s
        session.setMaxInactiveInterval(60);
        session.setAttribute("u", "jack");

        //回复一下浏览器
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<h1>创建session成功, 设置生命周期60s</h1>");
        writer.flush();
        writer.close();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request, response);
    }
}

생성 읽기 세션2

public class ReadSession2 extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //System.out.println("ReadSession2 被调用...");

        //1. 获取到session
        HttpSession session = request.getSession();
        System.out.println("ReadSession2 sid= " + session.getId());
        //2. 读取session的属性
        Object u = session.getAttribute("u");
        if (u != null) {
    
    
            System.out.println("读取到session属性 u= " + (String) u);
        } else {
    
    
            System.out.println("读取不到session属性 u 说明原来的session被销毁");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request, response);
    }
}

세션 수명 주기의 해석

  1. 세션에 대한 두 방문 사이의 최대 간격을 나타냅니다.

  2. 세션이 만료되지 않은 상태에서 세션을 운영하면 계산 수명 주기가 다시 시작됩니다.

  3. 세션 만료 여부는 서버에서 유지 및 관리

  4. invalidate()를 호출하면 세션이 직접 삭제/파기됩니다.

  5. 세션 개체의 속성을 삭제하려면 removeAttribu(“xx”)를 사용하십시오.

코드 예제

DeleteSession 만들기

public class DeleteSession extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("DeleteSession 被调用...");

        //演示如何删除session
        HttpSession session = request.getSession();
        session.invalidate();

        // 如果你要删除session的某个属性
        //session.removeAttribute("xxx");

        //回复一下浏览器
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        writer.println("<h1>删除session成功</h1>");
        writer.flush();
        writer.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request, response);
    }
}

세션클래식 사례 - 관리페이지 불법접근 방지

필요

비밀번호가 666666이면 로그인에 성공한 것으로 간주합니다.

사용자 이름은 제한되지 않습니다

  1. 확인에 성공하면 관리 페이지 ManageServelt.java를 입력하고 그렇지 않으면 error.html을 입력합니다.

  2. 사용자가 ManageServet.java에 직접 액세스하는 경우 재설정

로그인.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<h1>用户登录界面</h1>
<form action="/cs/loginCheck" method="post">
    u:<input type="text" name="username"><br/>
    p:<input type="password" name="pwd"><br/>
    <input type="submit" value="登录">
</form>
</body>
</html>

로그인체크서블릿

public class LoginCheckServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("LoginCheckServlet 被调用..");
        //功能-> 自己拆解 -> 逐步实现
        //1. 得到提交的用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if("666666".equals(password)) {
    
    //认为合法
            //把用户名保存到 session
            HttpSession session = request.getSession();
            session.setAttribute("loginuser", username);

            //请求转发到ManageServlet
            request.getRequestDispatcher("/manage").forward(request, response);
        } else {
    
    
            //请求转发进入到 error.html
            request.getRequestDispatcher("/error.html").forward(request, response);
        }


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request, response);
    }
}

서블릿 관리

public class ManageServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        //判断该用户是否登录过
        HttpSession session = request.getSession();
        Object loginuser = session.getAttribute("loginuser");
        if(loginuser == null) {
    
    //说明该用户没有登录
            //重新登录-> 请求重定向
            //response.sendRedirect("/cs/userlogin.html");
            response.sendRedirect(request.getContextPath() + "/userlogin.html");
            return;
        } else {
    
    
            response.setContentType("text/html;charset=utf-8");
            PrintWriter writer = response.getWriter();
            writer.println("<h1>用户管理页面</h1>");
            writer.println("欢迎你, 管理员:" + loginuser.toString());
            writer.flush();
            writer.close();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doPost(request, response);
    }
}

error.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录失败</title>
</head>
<body>
<h1>登录失败</h1>
<!--
web工程路径专题
1. a 标签是 浏览器解析
2. 第一 / 被解析成 http://localhost:8080/
3. 如果没有 / 会以当前浏览器地址栏 的 http://localhost:8080/工程路径../资源 去掉资源部分作为参考路径
-->
<a href="/cs/userlogin.html">点击重新登录</a>
</body>
</html>

Supongo que te gusta

Origin blog.csdn.net/apple_67445472/article/details/131778631
Recomendado
Clasificación