Session
1.session常用方法
String getId() 获取 sessionID
主要作用:完成用户会话
服务器⽆法识别每⼀次 HTTP 请求的出处(不知道来⾃于哪个终端),它只会接受到⼀个请求信号,所以就存在⼀个问题(将⽤户的响应发送给其他⼈),必须有⼀种技术来让服务器知道请求来⾃哪,这就是会话技术。
一次会话:就是客户端和服务器之间发⽣的⼀系列连续的请求和响应的过程,打开浏览器进⾏操作到关闭浏览器的过程。
会话状态:指服务器和浏览器在会话过程中产⽣的状态信息,借助于会话状态,服务器能够把属于同⼀次会话的⼀系列请求和响应关联起来。
index.jsp
<%String sessionId = session.getId();%>
<h1>sessionId : </h1>
<%=sessionId%>
void setMaxInactiveInterval(int interval) 设置 session 的失效时间,单位为秒
(短时间内登陆不用重复输入账号密码,7day)
int getMaxInactiveInterval() 获取当前 session 的失效时间
void invalidate() 设置 session ⽴即失效
void setAttribute(String key,Object value) 通过键值对的形式来存储数据
Object getAttribute(String key) 通过键获取对应的数据
void removeAttribute(String key) 通过键删除对应的数据
案例: 实现⽤户登录,如果⽤户名和密码正确,则跳转到首页并且展示⽤户名,否则重新回到登陆。登陆成功后,在浏览器不关闭的情况下,直接访问session会展示用户名(session),实现退出功能,即再次访问主页不会显示用户名。
注: 在上一个同类型案例中,check.jsp 文件中只用到了java代码,却使用的是 .jsp 文件,并不符合开发规范,这次我们使用 servlet 实现核对功能。
- login.jsp 登录界面提交表单
<%--
Created by IntelliJ IDEA.
User: haoqi
Date: 2020/10/6
Time: 13:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录界面</title>
</head>
<body>
<form action="/login.jsp" method="get">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<%-- 在后端查看--%>
<%System.out.println("login.jsp 提交了~~");%>
<td><input type="submit" value="登录"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>
- 信息核对界面—在 com.hou.session 目录下面—LoginServlet.java
package com.hou.session;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author haoqi
* @Date 2020/10/6 - 13:49
*
* 对 login.jsp提交的表单进行检查
*/
public class LoginServlet extends HttpServlet {
private String myUsername;
private String myPassword;
@Override
public void init(ServletConfig config) throws ServletException {
//获取xml中自定义的用户名和密码
myUsername = config.getInitParameter("username");
myPassword = config.getInitParameter("password");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
//在 login.jsp 中标签 <form action="/login.jsp" method="post">
//声明了请求类型位 post ,所以在 doPose里面实现
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//login.jsp 文件框里的值
String username = req.getParameter("username");
String password = req.getParameter("password");
//将用户名,密码 定义位初始化参数,则不能使用注解映射,采用xml
if (username.equals(myUsername) && password.equals(myPassword)){
//利用 Session 存储用户名,密码
HttpSession session = req.getSession();
session.setAttribute("username",username);
//不用 session 直接 req
// req.setAttribute("username",username);
req.getRequestDispatcher("welcome.jsp").forward(req,resp);
} else //重定向
resp.sendRedirect("/login.jsp");
}
}
注: 在这里,获取正确的用户名和密码的方式是:将用户名和密码初始化为参数,即从XML文件里面获取,用MXL实现映射关系。
- XML文件,实现映射关系—web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.hou.session.LoginServlet</servlet-class>
<!-- 初始化自定义参数-->
<init-param>
<param-name>username</param-name>
<param-value>haoqi</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app><?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.hou.session.LoginServlet</servlet-class>
<!-- 初始化自定义参数-->
<init-param>
<param-name>username</param-name>
<param-value>haoqi</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
- welcom.jsp
<%--
Created by IntelliJ IDEA.
User: haoqi
Date: 2020/10/6
Time: 14:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>welcome</title>
</head>
<body>
<h1>Hello Welcome !</h1>
<!--欢迎回来~! <%=request.getAttribute("username")%>--从request里面取-->
<!--从session里面取,因为在LoginServlet.java是用session发送的信息-->
欢迎回来~! <%=session.getAttribute("username")%>
<a href="logout.jsp">推出~~</a><!--退出,销毁session-->
</body>
</html>
- 退出功能—在 com.hou.session目录下面—LogoutServlet.java
package com.hou.session;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @author haoqi
* @Date 2020/10/6 - 14:13
*/
@WebServlet("/logout") //对应welcome.jsp中的推出
public class LogoutServlet extends HttpServlet {
//a标签的请求类型是 get ,所以在 doGet 里面实现
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate(); //立刻失效
resp.sendRedirect("login.jsp"); //回到登录页面
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
4.JSP内置对象的作用域
在这里我们仅讨论4个
page、 request、 session、 application
因为它们都具有:setAttribute、 getAttribute 方法
page 作⽤域:对应的内置对象是 pageContext。
request 作⽤域:对应的内置对象是 request。
session 作⽤域:对应的内置对象是 session。
application 作⽤域:对应的内置对象是 application。
范围大小:page < request < session < application
page 只在当前⻚⾯有效。
<body>
<%
pageContext.setAttribute("name","Tom");
%>
<h1>pageContext</h1>
<%
String name=(String) pageContext.getAttribute("name");
out.write(name);
%>
</body>
request 在⼀次请求内有效。
session 在⼀次会话内有效
application 对应整个 WEB 应⽤的。
只要tomcat不关闭,关闭浏览器,其他浏览器均可访问
3案例:网站的访问量统计
当刷新浏览器或更换浏览器访问时,次数会增加
<%
Integer count=(Integer)application.getAttribute("count");
if (count==null){
count=1;
application.setAttribute("count",count);
}else{
count++;
application.setAttribute("count",count);
}
%>
你是当前的第<%=count%>访客。
增加
<%
Integer count=(Integer)application.getAttribute("count");
if (count==null){
count=1;
application.setAttribute("count",count);
}else{
count++;
application.setAttribute("count",count);
}
%>
你是当前的第<%=count%>访客。