可以在controller与view中直接通过session与cookies访问,在model中无法访问。
cookie会随着浏览器每次发起的请求(request)传给服务器进行读取,而服务器则会在应答(response)中携带cookie写在本机上。 因此,cookie是存储在本地的。而且由于cookie的这种性质,cookie必须在赋值后的下一次请求中才能“生效”
Session
- #存信息
- session[:current_user_id ] = user.id
- #取信息
- session[:current_user_id ]
- #删除信息
- session[:current_user_id ] = nil
- #清空信息
- reset_session
Cookies
cookies操作稍微有点多,因为关系到明文/加密,过期时长
1、默认为关闭浏览器,自动过期;明文存储。
- #存信息
- cookies[:id ] = "rubyer.me"
- #取信息
- cookies[:id ] #输出"rubyer.me"
- #删除信息
- cookies.delete(:key ) #与session不同
- #清空信息(不能直接删除,置过期即可)
- <% cookies[:id ] = { :expires => 2.weeks.ago.utc} %>
2、指定2周后过期
- cookies[ :user_preference ] = {
- :value => @current_user .preferences,
- :expires => 2.weeks.from_now.utc
- }
3、永久存储。实际为20年后过期,非永久
- cookies.permanent[ :user_preference ] = @current_user .preferences
相当于
- cookies[ :user_preference ] = {
- :value => @current_user .preferences,
- :expires => 20.years.from_now.utc
- }
- cookies.signed[ :id ] = "45"
- #存储结果类似
- cookies[:id ] #返回“BAhJIgc0NQY6BkVU--a07249e5ce4374f62b7af628c70c679caa11c10b”
- #读取值
- cookies.signed[:id ] #返回"45"
5、加密并永久存储
- cookies.permanent.signed[ :id ] = "45"
- cookies.signed[:id ]
思路:表中保存用户的用户名,密码(处理过),密匙,或者把cookies放在特意的一张表中
密码加密是对用户的输入的密码进行md5加密,我做的是md5加密后,再二次用hash加密,密匙是随机生成给用户的随机string,目的是对它进行加密后作为用户的cookie
自动登陆是在本地电脑保存cookie即可,然后读取保存的cookie的值看在数据库中有没有,有的话,就自动登陆,没有的话就跳出登陆框
核心代码:
model:
class User < ActiveRecord::Base
# sha1 加密
def self.sha1(pass)
Digest::SHA1.hexdigest(pass)
end
# md5 加密
def self.md5(pass)
Digest::MD5.hexdigest(pass)
end
# hash 加密
def self.password_hash(pass)
Digest::SHA256.hexdigest(pass)
end
# 混合二次加密
def self.mix_password(pass1,pass2)
password_hash(md5(pass1.to_s).to_s+pass2.to_s)
end
# 随机产生字符串
def self.random_string(len)
randstring = ""
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
1.upto(len) { |i| randstring << chars[rand(chars.size-1)] }
return randstring
end
# 向user表中添加记录
def self.create(name,password,pwd_salt)
@user = User.new do |f|
f.name = name
f.password = password
f.pwd_salt = pwd_salt
f.save
end
end
#判断登陆信息
def self.try_to_login(login_name,login_password)
transaction do
User.find(:first,:conditions=>["name=? and password=?", login_name, login_password])
end
end # 取得登陆用户的密匙
def self.get_pwdsalt(login_name)
transaction do
User.find(:first,:conditions=>["name=?",login_name]).pwd_salt
end
end
end
controller:
class LoginController < ApplicationController
before_filter :login_from_cookie
def login_from_cookie #自动登陆
# cookies.delete :riskfit_token
user = Cookieauto.find(:first,:conditions=>["pwd_salt=?",cookies[:riskfit_token]])
if user && !user.nil?
render :partial=>'success'
end
end
#向数据库添加记录
def new
name = params[:user][:name]
password = params[:user][:password]
rand_string = User.random_string(30)
mix_password = User.mix_password(password,rand_string)
User.create(name,mix_password ,rand_string)
end
#登陆
def logon
name = params[:user][:name]
password = params[:user][:password]
pwd_salt = User.get_pwdsalt(name)
mix_password = User.mix_password(password,pwd_salt)
login_user = User.try_to_login(name,mix_password)
if params[:auto]
Cookieauto.create(name, pwd_salt)
cookies[:riskfit_token]={:value=>pwd_salt,:expires => Time.now + 7.days}
end
if !login_user.nil?
render :partial => 'success'
puts "render"
end
end
#method:logout
def logout
cookies.delete :riskfit_token
render :action=>'index'
end
end
sql:
DROP TABLE IF EXISTS `cookieautos`;
CREATE TABLE `cookieautos` (
`id` int(20) NOT NULL auto_increment,
`name` varchar(30) default NULL,
`pwd_salt` varchar(128) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(30) default NULL,
`password` text,
`pwd_salt` varchar(128) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
source:
http://www.namipan.com/d/87f7886a3c0660304c48d2b03385810c084ddb7aabbf0100
来自:http://www.blogjava.net/fl1429/archive/2009/03/26/262191.html
相关推荐
此外,还包含关于响应格式化、cookies和session管理的内容。 4. **路由(Routes)**:Rails的路由系统将URL映射到控制器的动作上。通过阅读文档,你可以学习如何配置路由,设置资源、命名路径以及使用约束和条件。 ...
1. ** Sessions 显示**:在开发过程中,Session数据往往承载着用户状态和会话信息,查看这些数据有助于理解用户行为和应用逻辑。 2. ** 请求参数**:Rails Footnotes能够展示HTTP请求的所有参数,包括GET和POST数据...
文档还触及了更高级的主题,如Session和Cookies的管理,这是Web开发中处理用户状态和数据持久化的重要方面: - **Session**:讲解了Session的概念、存储方式及管理策略,包括如何将模型实例存储在Session中,以及...
总的来说,`plug_rails_cookie_session_store`是一个帮助Elixir Phoenix应用实现与Rails兼容的会话存储解决方案,方便在Rails和Phoenix之间进行迁移或整合项目,同时确保会话管理的一致性。通过使用这个插件,开发者...
7. **会话和cookies**:讲解如何使用Rails的session和cookie机制来管理用户状态。 8. **表单和链接**:介绍如何创建HTML表单以及使用Rails的辅助方法创建链接,实现用户交互。 9. **部署**:讲解如何将应用程序...
11. **会话与cookies**:讨论用户认证和会话管理,包括session和cookie的使用。 12. **部署与配置**:讲解如何将Rails应用部署到服务器,如Heroku或AWS,并进行生产环境的配置。 13. **安全与最佳实践**:涵盖CSRF...
默认情况下,Rails将session数据存储在cookies中,但也可以配置为使用其他后端,如数据库或内存中的缓存,这就是"session_backend"这个名字的由来。 项目可能包含以下关键组件: 1. **Models**:代表数据库中的表和...
通过学习这部分,你可以了解如何安全地存储和验证用户的凭证,以及如何利用cookies和session来跟踪用户状态。 错误处理和测试是确保应用稳定性和健壮性的关键。sample_app包含了测试驱动开发(TDD)的例子,使用...
6. **会话(Session)和cookies**:用于维持用户状态,如登录信息,Rails提供内置支持。 7. **身份验证和授权**:可能使用如Devise这样的gem进行用户认证,而CanCanCan或Pundit用于权限管理。 8. **测试**:Rails...
Ruby的`ActionDispatch::Cookies`模块在Rails中提供了这样的保护,例如,它会自动为每个Cookie添加安全和HttpOnly标志,防止JavaScript访问。 在解压的文件"cookie-master"中,可能包含了示例代码或教程,帮助你更...
饼干出轨 解码并可选择验证未加密的 Ruby on Rails cookie 的签名。 对此的替代实现要求您... _app_session ; 解码一个 cookie,使用 Rails 应用程序的秘密令牌验证它没有被篡改: var value = derail . decode ( req
会话管理允许Web应用在不同的HTTP请求之间存储和检索数据,而无需将这些信息包含在URL中或者通过cookies传递。这在处理登录状态、购物车或其他需要临时存储用户信息的情况下尤其有用。使用"scotty-session",开发者...
ActionDispatch::Session::CookieStore ActionDispatch::Flash ActionDispatch::ParamsParser ActionDispatch::Head Rack::ConditionalGet Rack::ETag ActionDispatch::BestStandardsSupport Application root C:/...
介绍Rails session方法使我们可以访问Rails会话。 会话是使用Cookie实现的数据存储。 您可以在会话中存储简单的数据结构。 ActiveRecord模型,否。 字符串或数字数组,是的。 基本上,坚持使用数据文字-数字,字符串...
介绍Rails session方法使我们可以访问Rails会话。 会话是使用Cookie实现的数据存储。 您可以在会话中存储简单的数据结构。 ActiveRecord模型,否。 字符串或数字数组,是的。 基本上,坚持使用数据文字-数字,字符串...
在JSON API中,传统的session-based身份验证不适用,因为API通常不依赖于cookies。相反,`devise_token_auth` 使用访问令牌进行身份验证。每次用户成功登录后,服务器会生成一对唯一且不可预测的令牌(access_token...
因此,在设计Web应用时,需要谨慎使用Cookie,并考虑使用更安全的存储机制,如Session或LocalStorage。 总的来说,Cookie是构建Web应用不可或缺的一部分,尤其在用户身份验证和个性化体验方面。理解如何在Ruby这样...
Rails框架内置了session支持,开发者可以方便地设置和获取session数据。 2. **ActiveRecord**:这是Ruby on Rails框架的一部分,用于数据库操作。在trackable功能中,可能需要创建UserActivity或类似的模型来存储...
- **会话管理**:保持用户会话状态,如使用cookies和session。 - **错误处理**:捕获并处理可能出现的错误,如404 Not Found、500 Internal Server Error等。 3. **常用网络服务器模块** - **Node.js**:使用V8...
7. **学习进度追踪**:通过cookies或session追踪用户的学习进度,以便为用户提供个性化推荐和学习建议。 8. **API集成**:可能与其他服务(如支付网关、邮件服务)通过API进行集成,实现支付功能和通知服务。 9. *...