HTTP协议自身是属于无状态的协议,意思就是默认情况下HTTP协议的客户端和服务器的上一次通信和下一次通信之间是没有关系的,在实际开发中我们需要知道请求之间的关联关系,例如我们登陆过一个网站,当再次登陆该网站时,服务器就知道已经登陆过该网站了
回顾关于cookie的几个知识点
1.cookie是浏览器提供的,持久化存储数据的机制
2.cookie 是从服务器返回给浏览器的,是由程序员代码决定的要在浏览器cookie中保存哪些数据,通过http响应的Set-Cookie字段把键值对写回去
3.cookie在浏览器存储的目的是后续访问服务器的时候,通过请求的header将cookie发送给服务器
作用:因为服务器是同时服务多个客户端的,客户端需要借助cookie来告诉服务器当前提供的服务到哪个环节了,服务器也可以通过cookie识别该客户端
4.cookie存储在浏览器所在的硬盘中,浏览器根据域名分别存储,有很多cookie,访问一个网站就按域名存储一个cookie
cookie最典型的应用:表示用户的身份信息.
很多网站多有登录功能

当浏览器再次访问服务器时, 请求中就会有cookie,cookie中带有身份序号,服务器查询到身份序号,就能判断身份信息,避免了重复输入登录信息.没查到就重新输入登录信息.访问其他页面也是相同,如果有cookie,就能访问服务器其他页面,删除cookie后刷新,登陆状态就变了,因为本地存储的身份序号被删除了,再次发送请求时,服务器查询不到身份序号了
cookie过期可能是服务器或客户端删掉了,安全性越要高的网站cookie过期时间越长.
HTTP 的cookie字段中存储的实际上是多组键值对. 每个键值对在 Servlet 中都对应了一个cookie对象. 通过 HttpServletRequest.getCookies() 获取到请求中的一系列cookie键值对. 通过 HttpServletResponse.addCookie() 可以向响应中添加新的cookie键值对.
上述服务器生成了一些键值对结构数据,就是session(会话)
生成的唯一的身份序号叫做sessionid,也就是key,value就是记录的身份信息
sessionId是由服务器生成的"唯一性字符串",从 session 机制的角度来看, 这个唯一性字符串
Cookie与Session的关联与区别
点击提交,然后进行抓包

实现两个类
先编写LoginServlet处理请求
package login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//先使用getParameter获取到username,password的值
String username = req.getParameter("username");
String password = req.getParameter("password");
//验证信息是否正确
//正常用数据库保存,这里写死
//合法:zhangsan 12345
if(!username.equals("zhangsan")){
//失败
//重定向=>登录页
System.out.println("用户名错误");
resp.sendRedirect("login.html");
return;
}
if(!password.equals("12345")){
//失败
System.out.println("密码错误");
resp.sendRedirect("login.html");
return;
}
//成功
//创建会话
HttpSession session = req.getSession(true);
//getSission(true);是拿着sessionId查一下哈希表,
//如果sessionId不存在.或者没查到,就创建新会话插入到哈希表
// 查到了就返回查到的结果
//如何创建?
//1.构造HttpSession对象
//2.构造唯一的sessionId
//3.把这个键值对插入哈希表
//4.把sessionId设置到响应报文Set-Cookie字段
//将用户信息保存到session对象中.
session.setAttribute("username",username);
//重定向到主页
resp.sendRedirect("index");
}
}

getSission(true);是拿着sessionId查一下哈希表,如果sessionId不存在.或者没查到,就创建新会话插入到哈希表,查到了就返回查到的结果,没查到就重新创建一个,(false)是不创建.有了获取,没有不管
创建会话过程?
1.构造HttpSession对象
2.构造唯一的sessionId
3.把这个键值对插入哈希表
4.把sessionId设置到响应报文Set-Cookie字段HttpSession对象也是一个键值对
每个会话中:
key:sessionId value:HttpSession对象
每个HttpSession对象中:
类似
key:"username"value:"zhangsan"
setAttribute,getAttribute来存取键值对,内容是程序员定义
接下来编写生成动态页面代码
package login;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//先判定用户登陆状态
//若没登陆.先登录
//若登录,根据绘画用户名信息,显示到页面上
HttpSession session = req.getSession(false);
//不会触发会话创建
if(session==null){
System.out.println("用户未登录");
resp.sendRedirect("login.html");
return;
}
String username = (String) session.getAttribute("username");
//执行到这里,session和post中的是一个对象
//根据同一个sessionid对应到的对象
resp.setContentType("text/html;charset = utf8");
resp.getWriter().write("欢迎回来!" + username);
}
}
HttpSession session = req.getSession(false);
//不会触发会话创建意思是如果有session,就获取,没有也不创建
getAttribute("username");是获取键的值
重启服务器执行:
这是第一次执行:
抓包结果
请求

响应

注意这里设置了cookie
jsessionid就是sessionid
Location是接下来要跳转的重定向的位置
注意:我们第二次发起请求了!

抓包后:

Cookie: JSESSIONID=C21C914A93AC8AD3A546B6F9ED26A274
我们可以发现有个 JSESSIONID,这就是sessionId,值是唯一的数字.第一次的post请求是没有这个字段的!!
响应结果:

只要这次登陆完成了,后续登录请求都会带上刚才的cookie的值(sessionId)
使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p
我在rubyonrails应用程序中有以下新方法:defnewifcookies[:owner].empty?cookies[:owner]=SecureRandom.hexend@movie=Movie.new@movie.owner=cookies[:owner]end基本上,每个新用户都应该获得一个代码来识别他们(尽管只是通过cookie)。因此,当用户创建电影时,创建的cookie将存储在owner字段中。所以有两个问题:使用.empty?方法,当我从浏览器中删除cookie时,返回一个undefinedmethodempty?'对于nil:NilClass`当我确实已经在
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject
我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL
我在我的Rails应用程序中使用设计。我在租户庄园中配置了它,其中帐户/session的范围限定为子域。例如:http://subdomain1.example.com/http://subdomain2.example.com/...这很好用,但我想为“super管理员”添加一个子域,允许这些用户导航到所有其他子域而无需重新验证。这将是这样的:http://admin.example.com/是否可以自定义仅在管理子域上生成的cookie,以便它在所有其他子域上都有效? 最佳答案 Cookie域的定义越不具体,它们的包容性就越大,
我正在处理oauth1.0(twitter和flickr)。网站工作在80端口,oauth服务器工作在8080端口算法:向oauth服务器发送ajax请求以检查用户是否有有效的access_token如果用户没有access_token或access_token已过期,则打开授权窗口在oauth服务器的用户session中保存access_token发送分享数据到oauth服务器它使用sinatra+rack:session+rack::session::sequel+sqlite来存储session。它在每个响应中发送Set-Cookie:rack.session=id我正在使用2种
我正在尝试为使用omniauth-google-oauth2gem创建session编写测试。我是否需要将env["omniauth.auth"]变量与post:create一起传递?也许当我试图这样做时,我做错了。我得到的错误如下所示...Rake测试错误1)Error:SessionsControllerTest#test_should_get_create:NoMethodError:undefinedmethod`provider'fornil:NilClassapp/models/user.rb:6:in`from_omniauth'app/controllers/sessi
当使用rubyselenium驱动程序驱动chrome时,我得到/home/travis/.rvm/gems/ruby-2.6.2/gems/selenium-webdriver-3.141.5926/lib/selenium/webdriver/remote/response.rb:72:in`assert_ok':sessionnot创建:Chrome版本必须在70和73之间(Selenium::WebDriver::Error::SessionNotCreatedError)如何解决这个问题?降级chrome不是我想做的事。 最佳答案
我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=