1. 无状态访问
浏览器发送请求,服务器给予一定的响应,但是会断开连接,当再次发送一个请求时,之前的网页状态与再次请求的网页状态无关,整个就是HTTP协议的特征,无状态连接的特征。
实际操作过程中:
例如:
自动登录:用户登录界面后,服务器给与一定的响应,通过会话控制直接会保持当前的状态,浏览器会保存之前页面的状态,下一个页面如果要使用,就直接取出使用。
2. 会话控制
2.1 会话控制采用的技术
cookie:浏览器中保存的内容,保存在浏览器本地,每一次访问服务器,会自动带有保存到cookie的信息,并且cookie大小有限制,通常限制为:4096byte 4KB 现在:8192byte
cookie的信息不能保存为中文,信息形式以键值对形式存在。
session:(工作中用session)
保存在服务器中,每一个session在当前的服务器中都会有一个唯一的标识符,还会保存一些浏览器访问服务器的信息。
信息的保存以键值对形式存在。
2.2 Cookie
Cookie使用的前提:浏览器开启了cookie功能。
常用的API:
- Cookie的构造方法:
- cookie只保存字符串
- Cookie(String name,String value)
- 设置Cookie的方法:
- setValue(); 修改cookie的值
- setMaxAge(参数); 修改cookie的有效时间 参数:
- 正数 有效时间
- 负数 表示当前cookie在目前浏览器打开的状态下存在,关闭浏览器后立刻被销毁
- 0 表示销毁当前的cookie
- setPath(String path); 几乎不用,设置当前cookie的有效路径
- 发送cookie到浏览器进行保存
- response.addCookie(Cookie cookie);
- 服务器获取浏览器的cookie的信息
- request.getCookies()
2.3 Session
使用Session的原因:
- cookie保存的数据比较单一,只能保存字符串;
- cookie不能保存中文;
- cookie存在大小限制,一般4kb;
- cookie在浏览器中保存时有一定限制;
- 不安全。
Session可以解决以上的问题。
HttpSession API
- HttpSession getSession(); 获取Session对象
- setAttribute(String name,Object obj); 设置Session
- Object getAttribute(String name); 获取Session的值
- getId(); (重要) 获取当前Session的id号,String类型
- invalidate(); 销毁Session
2.4 自动登录
LoginServlet
package com.project_login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String user = req.getParameter("user");
String pwd = req.getParameter("pwd");
//登录信息的验证,先把数据写死
//作业:从数据库中取值,判断和前端页面提交的数据是否一致,如果查出来有结果,将值设置到session即可
if ("卓璇".equals(user)&& "123".equals(pwd)) {
//创建session对象
HttpSession session = req.getSession();//参数默认为true
//获取当前session对象的ID
String id = session.getId();
//cookie的使用
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setMaxAge(60*60);//如果cookie关闭,session不能用,二者相辅相成
resp.addCookie(cookie);
//设置session的值
session.setAttribute("user","卓璇");
//跳转到主页
resp.sendRedirect("SuccessServlet");
}else{
// resp.sendRedirect("login.html");//相对路径
resp.sendRedirect(req.getContextPath()+"login.html");//绝对路径
}
}
}
SuccessServlet
package com.project_login;
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("/SuccessServlet")
public class SuccessServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//获取Session对象
HttpSession session = req.getSession(false);//false,并非以创建方式获取的Session对象
//判断Session对象中保存的信息
if (session != null && "卓璇".equals(session.getAttribute("user"))) {
// req.getRequestDispatcher("success.html").forward(req,resp);
String html = "<font size='7' face='楷体' color='green'>欢迎" + session.getAttribute("user") + "</font>";
//退出
html += "<a href='FailedServlet' style='color: red;font-size: 20px;'>退出</a>";
resp.getWriter().append(html);
}else{
//如果失败,重定向到登录界面
resp.sendRedirect("login.html");
}
}
}
FailedServlet
package com.project_login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/FailedServlet")
public class FailedServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(false);
if (session != null) {
//销毁
session.invalidate();
}
//销毁cookie
Cookie cookie = new Cookie("JSESSIONID","");
cookie.setMaxAge(0);
resp.addCookie(cookie);
resp.sendRedirect("login.html");
}
}
2.5 Servlet的封装
BaseServlet
package com.util;
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 java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@WebServlet("/BaseServlet")
public class BaseServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 1.获取请求中method的请求方式
*/
String methodName = req.getParameter("method");
/**
* 2.使用反射
* 获取class类对象,获取当前servlet程序的类对象
* 要求:必须是BaseServlet的子类
* */
Class<? extends BaseServlet> aClass = this.getClass();
/**
* 3.根据method和class类对象获取对应的方法
* method: add update delete select
*/
try {
Method method1 = aClass.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
/**
* 4.执行对应的方法
* this ActionServlet add delete update select
* */
Object invoke = method1.invoke(this, req, resp);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}