Session---⽤户会话
服务器⽆法识别每⼀次 HTTP 请求的出处(不知道来⾃于哪个终端),它只会接受到⼀个请求信号,所 以就存在⼀个问题:将⽤户的响应发送给其他⼈,必须有⼀种技术来让服务器知道请求来⾃哪,这就是 会话技术。
当多个客户端发送请求的时候,服务器并不知道是谁(A,B,C)进行的请求,需要一种技术

会话:就是客户端和服务器之间发⽣的⼀系列连续的请求和响应的过程,打开浏览器进⾏操作到关闭浏 览器的过程。
会话状态:指服务器和浏览器在会话过程中产⽣的状态信息,借助于会话状态,服务器能够把属于同⼀ 次会话的⼀系列请求和响应关联起来
实现会话有两种⽅式:
1. session(内置对象)
2. cookie(服务端的)(下一节讲)

String getId() :获取 sessionID
属于同⼀次会话的请求都有⼀个相同的标识符,sessionID,每个请求都有,我们在不同浏览器来看请求一下,可以看到每个会话id不同,服务端通过这样的形式进行区分

void setMaxInactiveInterval(int interval) :设置 session 的失效时间,单位为秒
int getMaxInactiveInterval() :获取当前 session 的失效时间
获取一个看看

void invalidate() :设置 session ⽴即失效
void setAttribute(String key,Object value) :通过键值对的形式来存储数
Object getAttribute(String key) :通过键获取对应的数据
void removeAttribute(String key): 通过键删除对应的数据
来个例子,jsp负责展示,servlet负责控制,我们来看看request合不合适干这个
先配置一下xml
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.gsdx.jsp.LoginServlet</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
写一个登录login.jsp
<body>
<form action="/login" method="post">
用户名<input type="text" name="username"><br>
密码<input type="password" name="password"><br>
<input type="submit" value="登录">
<%--点击可以清空--%>
<input type="reset" value="重置">
</form>
</body>
LoginServlet.java
public class LoginServlet extends HttpServlet {
//定义成员变量,在其他方法中可以访问
private String myusername;
private String mypassword;
@Override
public void init(ServletConfig config) throws ServletException {
//初始化加载一次,获取xml的参数,与后面的用户输入的进行对比
this.myusername = config.getInitParameter("username");
this.mypassword = config.getInitParameter("password");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取客户端输入参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//判断
if (username.equals(myusername) && password.equals(mypassword)) {
//通过健值对的形式保存数据
req.setAttribute("username",username);
//转发
req.getRequestDispatcher("welcome.jsp").forward(req,resp);
}else{
//重定向
resp.sendRedirect("login.jsp");
}
}
}
welcome.jsp
<body>
<h1>Welcome</h1>
<%
String name = (String)request.getAttribute("username");
%>
欢迎回来<%=name%>
</body>
来看看第一次请求和第二次请求的结果

第一次访问

第二次访问

我们发现第二次直接访问welcom.jsp时,请求值是null,相当于welcome.jsp没有获取到值,而是自己本省内置对象产生的值,没有保存之前我们输入的值
其实这是request声明周期太短的原因,request在一次请求和相应后就消失了 ,所以我们要用session来干这个事
所以我们来看看怎么解决
我们在原来的基础上改一改
还是发一下代码吧
LoginServlet.java
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取客户端输入参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//判断
if (username.equals(myusername) && password.equals(mypassword)) {
//在jsp里session为内置对象可以直接用,在servlet的doPost里需要用参数调用
HttpSession session = req.getSession();
//通过key value 形式获取客户端输入以便下面重定向
session.setAttribute("username",username);
//和request没什么关系了,也可以使用重定向
//req.getRequestDispatcher("welcome.jsp").forward(req,resp);
resp.sendRedirect("welcome.jsp");
}else{
//重定向
resp.sendRedirect("login.jsp");
}
}
<body>
<h1>Welcome</h1>
<%
String name = (String)session.getAttribute("username");
%>
欢迎回来<%=name%>
</body>
第一次运行

在第二个页面直接运行welcome.jsp,可以知道一次session中信息还未消失(之前看到时1800s消失)其他浏览器不行哦,都不是同一个会话

加个销毁功能拓展一下,在welco.jsp上加一个退出功能,写一个LougtServlet.java 来注销

点一下销毁便会退出到登录页面,然后我们在搜一下welcome.jsp看看session被销毁没有,我们可以看到是null

下期咱们cookie见
会话管理技术Session详解
本文介绍了会话管理技术Session的基础知识,包括其在客户端与服务器交互中的作用、如何使用Session对象来保存用户数据,以及Session的主要方法如getId、setMaxInactiveInterval等。并通过一个登录示例展示了Session的实际应用。
634

被折叠的 条评论
为什么被折叠?



