기사 디렉토리
세션 생명주기 및 세션 클래식 사례 - 관리 페이지에 대한 불법 접근 방지
세션 수명 주기
세션 수명 주기 - 설명
-
public void setMaxInactiveInterval(int interval) 세션 제한 시간(초)을 설정합니다. 지정된 시간을 초과하면 세션이 삭제됩니다.
-
값이 양수이면 세션 제한 시간을 설정합니다.
-
음수는 제한 시간이 없음을 의미합니다.
-
public int getMaxInactiveInterval() 세션 시간 초과를 가져옵니다.
-
public void invalidate()는 현재 세션 세션을 즉시 무효화합니다.
-
세션의 수명을 지정하기 위해 setMaxInactiveInterval()을 호출하지 않으면 Tomcat은 기본 세션 시간을 표준으로 사용하며 기본 세션 제한 시간은 30분이며 tomcat의 web.xml에서 설정할 수 있습니다.
-
세션의 수명 주기는 누적 시간이 아니라 클라이언트/브라우저의 두 요청 사이의 최대 간격을 나타냅니다. 즉, 클라이언트가 자신의 세션에 액세스하면 세션의 수명 주기가 0부터 다시 계산됩니다. (해석: 동일한 세션에서 두 요청 사이의 간격을 의미함)
-
하단 레이어: 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);
}
}
세션 수명 주기의 해석
-
세션에 대한 두 방문 사이의 최대 간격을 나타냅니다.
-
세션이 만료되지 않은 상태에서 세션을 운영하면 계산 수명 주기가 다시 시작됩니다.
-
세션 만료 여부는 서버에서 유지 및 관리
-
invalidate()를 호출하면 세션이 직접 삭제/파기됩니다.
-
세션 개체의 속성을 삭제하려면 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이면 로그인에 성공한 것으로 간주합니다.
사용자 이름은 제한되지 않습니다
-
확인에 성공하면 관리 페이지 ManageServelt.java를 입력하고 그렇지 않으면 error.html을 입력합니다.
-
사용자가 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>