request域:同一次请求内的数据的传递
一个servlet转发到一个jsp,那么我servlet里面的数据jsp是可以拿得到的,从而实现数据的传递,但是我们现在时基于http的无状态的(不会记住你之前所作所为),不会记录你的信息。
如何实现 在同一个用户同一个浏览器一段时间,多次请求内之间的数据进行传递,数据能够共享?
但是这个技术不能通过http实现,比如说登录的时候,订单的用户信息需要呢登录的信息,更不要说购买等等操作了,跨多次请求在不同的操作当中
JavaWeb实现
同一个用户同一个浏览器一段时间,多次请求 -> (会话/对话):客户端与服务器的会话,
开始标志:从客户端使用浏览器第一次访问服务器,表示会话的开始
中间:经的过N次请求
结束标志:当用户关闭浏览器,表示这一次的会话的结束
会话跟踪技术: http无状态的,在同一次会话中,多次请求之间的数据能够共享,这就是会话跟踪技术
- cookie
- HttpSession依赖于Cookie
如何保证这些请求是同一个会话的 然后进行多次请求 大家时并行发起请求,你怎么确认各个请求的请求对象,然后各个对象去属于自己的存储区去拿对象数据和存储数据就可以了
图解:(记住此时服务器时无记忆的,无状态的,不知道是那个客户端发的请求),此时张三与服务进行会话 李四与服务器进行会话 ,张三给服务器发起了很多个请求,现在要求,紫色的请求里面的数据只能张三拿,绿色的只能是是李四去拿??
两个问题:数据怎么存,以及怎么保证这些数据是张三的?
数据存在客户端浏览器里面,请求是由服务器的servlet所处理的,但是多个用户请求访问的是同一个servlet,而servlet是单例的,请求自己携带数据参数
cookie的数据存在客户端的浏览器上,缺点:不安全 (网吧电脑衍生出来的!!)
(也是需要借助于cookie)存服务器安全性肯定高了,但是这些服务器我需要在用户和我进行会话我这到那些数据是用户a
的,那些数据是用户b的???
解决办法:每一个数据绑定一个唯一的id值 这个id还要给到客户端那边去(怎么存过去呢)
所以此时请求里存的是id数据(但是这个id在session里面不会永久的保存,当用户把浏览器一关就没有了这个数据,下次别人就拿不到数据了,当然这个id是以cookie的方式进行存储,服务器里存的叫Httpsession数据,可以说服务器里面存的是一个一个HttpSeesion对象,里面的id也seesionId)
扩展
创建与服务器 保存与客户端浏览器 cookie不能跨浏览器 服务器通过响应对象把cookie保存到客户端浏览器上 Cookie在请求的时候,在请求头中包含Cookie,传递给服务器
kv键值对存储数据
Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器, 然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把cookie再发送给服务器。
webo3 cookie测试 com.huse.web CookieServlet cookie创建与服务器 保存在客户端浏览器上 doGet{ Cookie cookie1 = new Cookie("username","aaa"); Cookie cookie2 = new Coookie("age":"21";) response.addCookie(cookie1); response.addCookie(cookie2);//实现存储 //怎么取呢? 新的请求怎么取呢? } 访问cookieServlet:localhost:8080/CookieServlet 那个浏览器访问的,那个拥有对应的数据
此时完成了cookie的存取
Cookie默认最大存活时候: -1表示这个Cookie存活时间是会话级别,关闭浏览器的时候,该Cookie删除,重新打开浏览器就是一次新的会话了,会话的级别就是这样了解
doGet{
Cookie[] cookies = request.getCookie()
for(Cookie cookie:cookie){
Cookie cookie1 = new Cookie("username","aaa");
Cookie cookie2 = new Coookie("age":"21";)
cookie.setMaxAge(60);//1分钟之后客户端浏览器就会帮你清楚这个cookie
sout(cookie.getMaxAge());
response.addCookie(cookie);
}
}
打开浏览器 -> 打开Expires/MaxAge这一栏
Cookie默认最大存活时候: -1表示这个Cookie存活时间是会话级别,关闭浏览器的时候,该Cookie删除
设置:
setMaxAge(int):单位:秒,一旦指定时间,浏览器立即删除该CookiesetMaxAge(0):立即删除Cookie
7天有效:
写法格式cookie.setMaxAge(7*24*60*60);
ebo3 cookie测试
com.huse.web
CookieServlet
cookie创建与服务器 保存在客户端浏览器上
doGet{
Cookie cookie1 = new Cookie("username","aaa");
Cookie cookie2 = new Coookie("age":"21";)
response.addCookie(cookie1);
response.addCookie(cookie2);//实现存储
//怎么取呢? 新的请求怎么取呢?
}
访问cookieServlet:localhost:8080/CookieServlet 那个浏览器访问的,那个拥有对应的数据
此时完成了cookie的存取
怎么获取cookie里面的数据
cookie通过请求头带回到服务器 -》 找到请求就可以了所以
doGet{
Cookie[] cookies = request.getCookie()//得到客户端浏览器所有的cookie
for(Cookie cookie:cookie){
sout("name" + cookie.getName());
sout("value" + cookie.getValue())
}
}
//此时我不再需要访问Servlet了
那么说cookie1他的什么周期就是很长了,就算你关闭浏览器,cookie存在客户端的数据依然还是会在
怎么修改呢 --> 这里是以覆盖的方式
doGet{
Cookie[] cookies = request.getCookie()//得到客户端浏览器所有的cookie
for(Cookie cookie:cookie){
sout("name" + cookie.getName());
sout("value" + cookie.getValue())
//修改name为username的cookie的value
if(cookie.getName().equals("username")){
cookie.setValue("李四");//此时没有真正修改!要看客户端前台改 而不是后台
服务器修改数据就行,所以需要重新保存到客户端
cookie.addCookie(cookie);//并且cookie的name是唯一的,如果是一样的会进行覆盖
}
}
}
怎么删除cookie呢 更他的最大存活时间
cookie的存活时间 -> 删除对象应该是由客户端删除 而不是服务器删除的所以也就没有delte或者remove等等方法
doGet{
Cookie[] cookies = request.getCookie()
for(Cookie cookie:cookie){
Cookie cookie1 = new Cookie("username","aaa");
Cookie cookie2 = new Coookie("age":"21";)
cookie.setMaxAge(60);//1分钟之后客户端浏览器就会帮你清楚这个cookie
sout(cookie.getMaxAge());
response.addCookie(cookie);
}
}
打开浏览器 -> 打开Expires/MaxAge这一栏
想立即删除?
doGet{
Cookie[] cookies = request.getCookie();
for(Cookie cookie:cookie){
Cookie cookie1 = new Cookie("username","aaa");
Cookie cookie2 = new Coookie("age":"21";)
cookie.setMaxAge(0);//客户端浏览器就会立即帮你清楚这个cookie
cookie.setPath(/aaa);表示那些资源-> /aaa下面的资源可以被访问
sout(cookie.getMaxAge());
response.addCookie(cookie);
}
}
@WebServlet("/aaa/CookieServlet")
doGet{
Cookie[] cookies = request.getCookie()
for(Cookie cookie:cookie){
sout("name" + cookie.getName());
sout("value" + cookie.getValue())
cookie.setMaxAge(0);
cookie.setPath(/aaa);不是localhost:8080/aaa/CookieServlet;
}
}
不是localhost:8080/aaa/CookieServlet;
所以你直接访问localhost:8080/CookieServlet是访问不到cookie里面的数据的
login.html
默认path:/表示该服务器下的所有的资源都可以访问
@WebServlet("/aaa/CookieServlet")
doGet{
Cookie[] cookies = request.getCookie()
for(Cookie cookie:cookie){
sout("name" + cookie.getName());
sout("value" + cookie.getValue())
cookie.setMaxAge(0);
cookie.setPath(/aaa);不是localhost:8080/aaa/CookieServlet;
}
}
不是localhost:8080/aaa/CookieServlet;
所以你直接访问localhost:8080/CookieServlet是访问不到cookie里面的数据的
思路:登录的流程基础上加上这个 点击记住我时传一个参数(在前面三个参数都正确之后)
登录成功之后实现记住我的功能
1.如果用户勾选记住我了(后台怎么知道呢?发送post请求,在loader中remember有不同的状态,如果remember参数有值,用户就是勾选了,否则没有)
2.把用户名,密码以cookie形式保存到客户端浏览器
3.login.jsp 获取cookie ,把用户名,密码在文本框显示
实现记住我的功能 login.html
<% String name = ""; String pwd = ""; Cookie[] cookies = request.getCookies(); if(cookies != null && cookies.length >{ for(Cookie cookie : cookies){ if(cookie.getName().equals("username")){ username = cookie.getValue; } if(cookie.getPassword().equals("pwd")){ pwd = cookie.getValue; } } } %> first step: login.html -> login.jsp
创建于服务器,保存于服务器
底层依赖与Cookie的实现
我们可以把一个会话内需要共享的数据保存到HttpSession对象中!
为什么这么做?
Cookie:不安全, value只能是string 只能存储—对key/value
SessionI安全, value存储Object类型 一个session存储多对key/value
四大域(还有一个Page域)
Session:接口:HttpSession
getSession()底层调用的getSession(true) -> 推荐
true:如果当前没有session对象,创建一个新的session对象,有,返回之前的session对象false:有,返回之前的session对象,如果当前没有session对象,返回null
作为域对象使用
HttpServlet ServeltContext HttpSession
之前登录之后天跳转到首页 首页需要显示登录用户名
index.jsp 首页面:实现登录成功之后显示用户 并且有注销超链接 如果没有登录显超连接:亲请登录
这就要求把登录信息保存起来,保存到哪里呢? -> HttpSession域当中
request:要求同一次的同一个请求 不能使用重定向了 因为他是两次请求
application域:张三登录会把李四的数据覆盖 因为整个项目只有一个application域 会进行追加覆盖
张三存张三的东西 李四存李四的东西 session
张三与服务器进行的一次会话 通过在session域中存储张三的数据来域张三进行会话
重定向到一个页面 然后需要把这个数据重显到另一个页面就需要用到session了
根据跳转方式
重定向->session域
转发->request域
JSP九大内置对象(面试)
在JSP中无需创建就可以使用的9个对象
四大域对象(session page request application) response config pageContext out exception
index.jsp 首页面:实现登录成功之后显示用户 并且有注销超链接 如果没有登录显超连接:亲请登录
这就要求把登录信息保存起来,保存到哪里呢? -> HttpSession域当中
request:要求同一次的同一个请求 不能使用重定向了 因为他是两次请求
application域:张三登录会把李四的数据覆盖 因为整个项目只有一个application域 会进行追加覆盖
张三存张三的东西 李四存李四的东西 session
张三与服务器进行的一次会话 通过在session域中存储张三的数据来域张三进行会话
重定向到一个页面 然后需要把这个数据重显到另一个页面就需要用到session了
session判断呢是否是处于一个登录状态 -> 只有等我登录成功 session域才有数据
看session有没有用户信息
//在jsp中,得到session,不需要request.getSession()
LoginServlet.java
Login login = loginService.login(user,......);//开始进行判断是否登录成功
login.getSession().setAttribute("login",login);//存的是对象 这就不同于cookie了
java代码:<%%>
java代码穿插html<% >%%<% } %>
index.jsp
<%
Login login (Login)session.getSAttribute("login");
if(login != null){
String username = login.getUsername();
}
%>
欢迎<%=username%>登录
<%
}else{
%>
<%
}
%>
请你完成注销功能
访问控制:请你实现登录才能进行分页查询
QueryByPageUserServlet.java
doPost(HttpRequest request.HttpResponse response){
//从session里拿数据
if(request.getSession().getAttribute("login") == null){
response.sendRedirect("/login.jsp");
return;
}
//编码处理
request.setCharactreEncoding("UTF-8");
response.setContenetType("text/html'charset=utf-8");;
}
sessionId:浏览器会存着 只有当它关闭的时候才消失 一定要先登录
跳转到登录界面
同时删掉session不是仅仅删除一个Login对象,因为你的信息很大可能不仅仅是只有一个登录信息 让session失效 -> invalidate
void invalidate(): 让session失效!调用这个方法会被session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新session的
sessionld;
session的实现借助于cookie
访问控制:请你实现登录才能进行分页查询
QueryByPageUserServlet.java
doPost(HttpRequest request.HttpResponse response){
//从session里拿数据
if(request.getSession().getAttribute("login") == null){
response.sendRedirect("/login.jsp");
return;
}
//编码处理
request.setCharactreEncoding("UTF-8");
response.setContenetType("text/html'charset=utf-8");;
}
注销功能实现
超链接是get请求 -> 因为url发生了改变
1.让session失效
2.跳转到登录页面
doGet(){
request.getSession().isvalidate();
response.sendRedirect("/login.jsp");
}