会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,这称之为有状态会话。
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
Cookie是在浏览器访问WEB服务器的某个资源时, 由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。
底层的实现原理: WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器, 浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
创建、添加、设置时间、删除
public Cookie(String name, String value) ; // 创建cookie
public void setComment(String purpose); // 设置cookie的描述
public void setMaxAge(int expiry) // 设置 cookie的时间 单位为秒
public String getName() // 获得存的cookie的名字
public String getValue() // 获的cookie的值
// 删除的话 是设置时间为 0
当客户端浏览器访问服务器时,服务器会先检查该请求是否携带一个叫JESESSIONID的cookie,如果存在会根据JESESSIONID的cookie值获取存放在服务器端的session值;如果不存在会新建一个session然后把sessionId写到cookei中返回给浏览器,下次浏览器访问时就会携带这个cookie。
小demo
测试1 第一次登录不展示名字 第二次会展示存进去的值。
public class TestSessionServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
response.setCharacterEncoding("utf-8");
response.setHeader("content-type","text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
String loginName = (String) session.getAttribute("loginName");
String sessionId = session.getId();
if(StringUtils.isEmpty(loginName)){
session.setAttribute("loginName","张三");
writer.println("session中没有值!");
}else{
writer.println("loginName="+loginName);
}
writer.println("sessionId="+sessionId);
writer.close();
}
}
JavaWeb 中 Session 模拟登录、拦截
表单页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/sessionLogin" method="post">
用户名:<input name="username" type="text">
密码:<input name="password" type="password">
<input type="submit" value="Login">
</form>
</body>
</html>
里面用到的User类
/**
* @author crush
*/
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.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;
}
}
处理登录的Servlet
/**
* @author crush
* 实现自动登录
*/
@WebServlet("/sessionLogin")
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 开启session
HttpSession session = req.getSession();
// 获取登录的参数
String username = req.getParameter("username");
String password=req.getParameter("password");
// 设置字符编码
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
// 判断用户名和密码是否正确
if(username.equals("admin")&&password.equals("123456")){
// 存session
session.setAttribute("user",new User(username,password));
session.setMaxInactiveInterval(200);
writer.print("恭喜你登录成功!!!");
}
else{
System.out.println("账号或密码错误");
resp.sendRedirect("/login.jsp");
}
}
}
mian2请求 测试是否登录的请求
/**
* @author crush
*/
@WebServlet("/main2")
public class Main extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
User user =(User) session.getAttribute("user");
// 设置字符编码
resp.setContentType("text/html;charset=utf-8");
if(user==null){
// 没有登录会转向登录页面
resp.sendRedirect("/login.jsp");
}
else{
req.setAttribute("success","恭喜你做出了登录的小Demo!!!");
req.getRequestDispatcher("/hello.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
Hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello</title>
</head>
<body>
${success}
<br>
</body>
</html>
简单的一天。