4.1 HttpSession менен таанышуу
Эгерде бир нече суранычтар бир кардардан келсе, анда кардар менен сервердин ортосунда сессия пайда болду деп айтылат. Бул процессти көзөмөлдөө үчүн контейнерде атайын HttpSession объектиси бар.
Кардар сервлетке кайрылганда, сервлеттердин контейнери суранычта сессия ID параметринин бар-жогун текшерет. Эгерде андай параметр жок болсо (мисалы, кардар биринчи жолу серверге кайрылып жатса), анда сервлеттердин контейнери жаңы HttpSession объектисин түзөт, ошондой эле ага уникалдуу ID ыйгарат.
Сессия объектиси серверде сакталат, ал эми ID кардарга жооп катары жөнөтүлөт жана кадимки шарттарда кардар кукилордо сакталат. Андан кийин, ошол эле кардардан жаңы сураныч келсе, сервлеттердин контейнери андан ID алып, ошол ID аркылуу сервердеги туура HttpSession объектин табат.
Сессия объектин суранычтан (HttpServletRequest объектинен) алса болот, ал үчүн getSession() методун чакыруу керек. Бул метод HttpSession объектин кайтарат.
Сессия эмне үчүн керек? Анда кардар жөнүндө маалыматты чакыруулар ортосунда сактоого болот. Ичинде HashMap сыяктуу нерсе бар, анда объектилерди ачкычтар боюнча сактоого болот. Жана бул үчүн бир нече ыкмалар бар:
Методдор | Сүрөттөмө | |
---|---|---|
1 | setAttribute(String name, Object o) |
Объектини сессиянын ичине кошот |
2 | getAttribute(String name) |
Объектини сессиядан алат |
3 | removeAttribute(String name) |
Объектини сессиядан өчүрөт |
Кел, ар кандай суранычтардан келген бардык сандарды кошуп туруучу сервлет жазалы:
public class CalculatorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// Сессиядан "sum" атрибутун алабыз
HttpSession session = request.getSession();
Integer sum = (Integer) session.getAttribute("sum");
//Сессияда андай атрибут жок болгон учурдагы жагдайды иштетебиз
if (sum == null)
sum = 0;
// Суранычтан "n" параметрин алабыз
String n = request.getParameter("n");
sum += Integer.parseInt(n);
// Сессияга "sum" атрибутун жазабыз
session.setAttribute("sum", sum);
// Браузерге жооп катары HTML басып чыгарабыз
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head> <title> CalculatorServlet </title> </head>");
out.println("<body>");
out.println("<h1> Sum == " + sum + "</h1>");
out.println("</body>");
out.println("</html>");
}
}
4.2 HttpSession жөнүндө көбүрөөк
HttpSession объектиси жөнүндө дагы эмне маанилүү айтылбай калды?
Биринчиден, бул JSESSIONID аты. Дал ушул аталыш менен кукилерде сессиянын ID сакталат. Аны эстөө оңой: J+SESSION+ID
.
Экинчиден, сессияда дагы бир нече пайдалуу методдор бар:
Методдор | Сүрөттөмө | |
---|---|---|
1 | getAttributeNames() |
Сессияда сакталган бардык ачкычтардын тизмесин кайтарат |
2 | getId() |
Сессия ID кайтарат (жипче) |
3 | isNew() |
Эгерде сессия объектиси учурдагы суранычта түзүлгөн болсо true кайтарат |
4 | setMaxInactiveInterval(int seconds) |
Сессиянын активсиздик интервалын секунддар менен орнотот |
5 | invalidate() |
Сессиядагы бардык объектилерди өчүрөт |
Бул жерде бардык методдор ачык-айкын, ал эми setMaxInactiveInterval()
жөнүндө бир аз көбүрөөк сүйлөшөбүз.
Эгерде сервер он миңдеген сессияларды, былтыр айда серверге кирген кардарлардын маалыматтарын сактоо менен сактап калса, анда анын эс тутуму түгөнүп калышы мүмкүн. Ошондуктан "сессиянын жашоо убактысын" белгилөө ыкмасы бар.
Эгерде interval убактысынын ичинде сессия колдонулган жок болсо, ал өзүн-өзү тазалайт - анын ичинен ал сактаган бардык объектилер өчүрүлөт. Бул эс тутумду үнөмдөө үчүн жасалган.
Демейки шартта бул интервал 1800 секунд == 30 мүнөт. Эгерде -1 маанини койсо, анда сессия "түшпөс" болуп, колдонуучу браузердин бетин жапканда гана өчүрүлөт (же кардар байланышты үзгөндө).
Мисалдар:
|
|
|
GO TO FULL VERSION