SERVLETJSP Unit07: 状态管理-Session
来源:互联网 发布:win10usb端口重置失败 编辑:程序博客网 时间:2024/05/29 11:48
一.cookie和session
1.业务场景
- 登录时要记录账号
- 后续的查询,增加,修改等页面上显示此账号
2.错误的解决方案
1) request
- 登录是一个请求,查询是另外一个请求
- 2个请求服务器创建2个request,所以无法通过request共享这样的数据
2) config
- 可能使用LoginServlet处理登录请求
- 可能使用FindServlet处理查询请求
- 2个Servlet使用2个不同的config,所以无法通过config共享这样的数据
事实上config只能读取常量,无法存取变量
3) context
- 浏览器和服务器是1对多的关系
- 每个用户登录时传入的数据都是code=xxx
- 若将这样的数据存入唯一的context是有冲突的
3.cookie和session专门解决此类问题
- 它们内部的数据可以在多个请求之间共用
- 它们内部的数据可以在多个Servlet之间共用
- 服务器会给每个浏览器创建1组cookie,1个session
上述规则由tomcat保障
4.cookie和session的区别(面试题)
- cookie存储在浏览器上,服务器压力小,不安全
- session存储在服务器上,服务器压力大,安全
5.使用建议
- 重要的数据存入session
- 其他的数据存入cookie
二.cookie使用方式
1.基本用法
- 创建cookie
- 发送cookie
- 获取cookie
2.生存时间
- 修改cookie的生存时间: setMaxAge(n)
3.如何存中文
- 存数据时使用URLEncoder对中文转码
- 取数据时使用URLDecoder对中文解码
4.有效路径
- setPath(“”)
三.include中的相对路径
案例:
FindCostServlet.java
package web;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class FindCostServlet extends HttpServlet { //相当于MainServlet.findCost() @Override protected void service( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Cookie[] cs = req.getCookies(); if(cs != null) { res.setContentType( "text/html;charset=utf-8"); PrintWriter out = res.getWriter(); for(Cookie c : cs) { out.println( c.getName()+":"+c.getValue()); } out.close(); } }}
IndexServlet.java
package web;import java.io.IOException;import java.io.PrintWriter;import java.net.URLDecoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class IndexServlet extends HttpServlet { //相当于MainServlet.toIndex() @Override protected void service( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { //浏览器再次访问此服务器时,会自动传入 //之前保存的cookie,现在获取此cookie. Cookie[] cs = req.getCookies(); //将cookie中的数据显示到页面上 if(cs != null) { res.setContentType( "text/html;charset=utf-8"); PrintWriter out = res.getWriter(); for(Cookie c : cs) { String value = URLDecoder.decode( c.getValue(),"utf-8"); out.println( c.getName()+":"+value); } out.close(); } }}
LoginServlet.java
package web;import java.io.IOException;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet { //相当于MainServlet.login() @Override protected void service( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { //接收传入的参数 String code = req.getParameter("code"); //存入cookie,给其他功能使用 //1.一个cookie对象中只能存一个数据 //2.所存的数据必须是字符串 //3.可以创建更多个cookie以保存更多的数据 Cookie c1 = new Cookie("code",code); //设置cookie的生存时间 c1.setMaxAge(600000); //将cookie存入response,在服务器响应时, //会自动把cookie发送给浏览器. res.addCookie(c1); //向cookie中存中文 Cookie c2 = new Cookie("city", URLEncoder.encode("北京", "utf-8")); res.addCookie(c2); //设置cookie的有效路径 Cookie c3 = new Cookie("name","Tarena"); c3.setPath("/jsp3"); res.addCookie(c3); }}
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>jsp3</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>login</servlet-name> <servlet-class>web.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/main/login</url-pattern> </servlet-mapping> <servlet> <servlet-name>index</servlet-name> <servlet-class>web.IndexServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>index</servlet-name> <url-pattern>/main/index</url-pattern> </servlet-mapping> <servlet> <servlet-name>findCost</servlet-name> <servlet-class>web.FindCostServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>findCost</servlet-name> <url-pattern>/cost/find</url-pattern> </servlet-mapping></web-app>
四.session
五.session
1.基本用法
- 获得session: request.getSession()
- 存数据: session.setAttribute()
- 取数据: session.getAttribute()
- 删数据: session.removeAttribute()
- 销毁: session.invalidate()
2.超时时间
- 默认是30分钟
- 可以在配置文件中修改此时间
3.cookie禁用时session怎么办?
- 解决方案: URL重写
4.session销毁
案例:
FindCostServlet.java
package web;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class FindCostServlet extends HttpServlet { //相当于MainServlet.findCost() @Override protected void service( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { //获取旧的session,此session是在 //登录请求中服务器自动创建的. HttpSession session = req.getSession(); String code = (String) session.getAttribute("code"); //输出数据 res.setContentType( "text/html;charset=utf-8"); PrintWriter out = res.getWriter(); out.println(code); out.close(); }}
LoginServlet.java
package web;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet { //相当于MainServlet.login() @Override protected void service( HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { //接收参数 String code = req.getParameter("code"); //存入session //第一次访问session时服务器自动创建它, //当前登录就是第一次访问,就创建session HttpSession session = req.getSession(); //session中可以存任意类型的数据 session.setAttribute("code", code); //服务器向浏览器发送响应时,会自动创建 //一个cookie,并将SID存入此cookie,再 //将此cookie发送给浏览器.服务器会将 //此cookie的有效路径设置为项目. }}
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>jsp4</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>login</servlet-name> <servlet-class>web.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/main/login</url-pattern> </servlet-mapping> <servlet> <servlet-name>findCost</servlet-name> <servlet-class>web.FindCostServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>findCost</servlet-name> <url-pattern>/cost/find</url-pattern> </servlet-mapping> <!-- 配置session的ID释放时长 --> <session-config> <session-timeout>1</session-timeout> </session-config></web-app>
六.cookie和session理解
1.通俗的理解
- 它们都是暂存数据的对象,特征:
- 内部的数据可以在多个请求之间共用
- 内部的数据可以再多个组件之间共用
- 服务器会给每个浏览器创建一组cookie,一个session
2.专业的理解
- HTTP协议是一个无状态协议,即服务器默认不会记住浏览器
- cookie和session就是用来管理这种状态,让服务器记住浏览器的
- 即:它们都是用来进行状态管理的对象
状态: 用来证明浏览器曾经访问过的证据(数据)
阅读全文
0 0
- SERVLETJSP Unit07: 状态管理-Session
- SERVLETJSP学习(七)—— 状态管理-Session
- SERVLETJSP Unit06: 状态管理-cookie
- SERVLETJSP学习(六)—— 状态管理-cookie
- session 无状态管理
- 状态管理-Session
- 状态管理-Session
- 状态管理---cookie、session
- 状态管理-Session
- linux学习总结 unit07 ssh服务管理
- servletjsp
- ASP.NET状态管理之二:Session
- JavaWeb状态与会话管理Session
- C#状态管理(Application、Session、Cookie)
- ASP.NET 状态管理(cookie、Session)
- C#状态管理(Application、Session、Cookie)
- Web应用状态管理(Session)
- Jsp状态管理、Cookie与session
- 压缩包为什么比文件夹,传输速度快?
- 【OpenBCI】(1):Matlab实时读取数据流(labstreaminglayer)
- Vscode preview on Web Server 的一个坑
- 走向世界系列1: IPsec L2TP PPTP介绍与搭建vpn服务器
- 在浏览器中输入Google.com并且按下回车之后发生了什么?
- SERVLETJSP Unit07: 状态管理-Session
- 深度学习开发环境调查结果公布,你的配置是这样吗?(附新环境配置) By 李泽南2017年6月26日 15:57 本周一(6 月 19 日)机器之心发表文章《我的深度学习开发环境详解:Te
- mysql的varchar长度问题
- id定位
- 【正一专栏】中国当下的主要矛盾——个人极端主义泛滥带来的危机
- 责任链模式进阶:与AOP思想的融合与应用
- 让女有感觉
- 苹果审核被拒
- React项目中css引入配置方法