C#.net cookie、session实现自动登陆

C#.net cookie、session实现自动登陆

一、什么是用户自动登录?

对于我们的网站向已注册用户提供某些专门的服务,比如网上购物、在线下载、收费浏览等等,就会要求用户在使用这些服务之前进入登录页面,输入用户名和密 码,并进行验证。

如果用户经常访问我们的网站,假如每天都访问一次,或者好几次,那么用户每次都重复这些登录操作就会感到相当厌烦。通过一些简单的技术手段,我们可以让网 站“记住”那些在曾经登录过的用户。当该用户下次再来访问的时候,网站可以识别该用户,并为其自动完成登录过程。

二、基本思路

作为网站的编写者,我们无从知道坐在电脑前的那个人是谁。我们能够知道的是,访问网站的是哪一台电脑——这一点可以通过Cookie实现。因此,对用户的 识别实际上就是对客户端电脑的识别。

简单的说,当用户第一次登录网站的时候,网站向客户端发送一个包含有用户名的Cookie。当用户在之后的某个时候再次访问,浏览器就会向网站服 务器回送这个Cookie,于是,我们可以从这个Cookie中读取到用户名,然后调用登录的方法,从而实现自动为用户登录。

三、防止欺骗

Cookie只是一个普通的文本文件,那里面包含的字符串可以直接用记事本打开并进行编辑。因此任何人在任何电脑上都可以伪造一个包含有他人用户名 的 Cookie,从而实现对他人身份的冒用。要解决这个问题,就要在Cookie中附加一项信息,这个信息需要具有以下特性:1、和该用户一一对应;2、伪 造难度大。这些内容和用户名一起,以Cookie的形式发送给用户的浏览器。并且,服务器必须能够记住这项内容,以便用户再次访问的时候进行核对。

理论上,可以使用该用户的密码。密码具备了前述的两个特点。但是因为Cookie本身未经加密,保存于其中的密码(应该加密)可以被任何人看到,因此这个 方法极不安全。

另一种可以加以利用的信息是用户访问时的Session id。因为Session id是一个由系统随机产生的、无规律的、长度较长的字符串,因此它很难被伪造。要把它和用户对应起来,我们需要在数据库中添加一个表,这个表至少有两个字 段,一个是用户名,一个是Session id。当用户首次登录的时候,我们把当前的Session id和用户名分别用Cookie发送给用户,同时,把这两项作为一条记录插入数据库。这样,当用户再次访问的时候,服务器就可以读取客户端发来的这两个 Cookie,并且用它们的值和数据库中的记录比对。如果在数据库中找到了相应记录,就说明这台电脑的确是该用户上次登录时使用的电脑,进而可以为该用户 自动登录。

四、实现

1、在登录页面中添加一个复选框,让用户选择是否愿意在一定时间内实现自动登陆,例如两周。

代码:
<input type="checkbox" name="autologin">两周内自动登录

2、在负责处理登录过程的Servlet中,判断用户是否选择了该复选框。如果是,则执行这两个操作:向用户发送两个Cookie,以及向数据库写 入一条相应的记录。

代码:

Cookie ckUsername, ckSessionid;

if (autologin.equals("on")) {
// 如果用户选择了“两周内自动登录”,则向用户发送两个cookie。
// 一个cookie记录用户名,另一个记录唯一的验证码,
// 并将此验证码写入数据库,以备用户返回时查询。(防止伪造cookie)
ckUsername = new Cookie("autoLoginUser", user.getUsername()); // user是代表用户的bean
ckUsername.setMaxAge(60 * 60 * 24 * 14); //设置Cookie有效期为14天
res.addCookie(ckUsername);

sessionid = session.getId(); // 取得当前的session id
ckSessionid = new Cookie("sessionid", sessionid);
ckSessionid.setMaxAge(60 * 60 * 24 * 14);
res.addCookie(ckSessionid);

// 在数据库中插入相应记录
userSessionDAO.insertUserSession(user, sessionid);
}

3、实现自动登录。因为用户下次访问的时候,可能直接访问网站的任何页面(例如通过收藏夹),而不一定是首页或者登录页面,所以我们需要用 Filter拦截到达该网站的所有请求,并执行自动登录。

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(true);
String username;
String sessionid; // 此sessionid是上次用户登录时保存于用户端的识别码,用于用户后续访问的自动登录。不是本次访问的session id。
Cookie[] cookies;
CookieManager cm = new CookieManager(); // CookieManager是一个自定义的类,用于从Cookie数组中查找并返回指定名称的Cookie值。
boolean isAutoLogin;

// 如果session中没有user对象,则创建一个。
User user = (User) session.getAttribute("user");
if (user == null) {
user = new User(); // 此时user中的username属性为"",表示用户未登录。
}

// 如果user对象的username为"",表示用户未登录。则执行自动登录过程。
// 否则不自动登录。
if (user.getUsername().equals("")) {
// 检查用户浏览器是否发送了上次登录的用户名和sessionid,
// 如果是,则为用户自动登陆。
cookies = request.getCookies();
username = cm.getCookieValue(cookies, "autoLoginUser");
sessionid = cm.getCookieValue(cookies, "sessionid");
isAutoLogin = userSessionDAO.getAutoLoginState(username, sessionid); // 如果在数据库中找到了相应记录,则说明可以自动登录。

if (isAutoLogin) {
user.setUsername(username);
user.setNickname(DBUtil.getNickName(username));
session.setAttribute("user", user); // 将user bean添加到session中。
}
}
chain.doFilter(req, resp);
}

4、注销。只有当用户在上次访问时,未经注销就离开网站,我们才能在该用户下次访问时执行自动登录。如果用户显式的执行了注销操作,那就表示该用户 不希望我们记住他。我们需要在执行注销操作的Servlet中,从数据库中删除相应记录。这样,下次用户访问的时候就不会执行自动登录了。

五、改进

用户可能为了方便,自行修改Cookie中的有效期,从而达到长期自动登录的目的。对某些存有敏感信息的网站来说,这样做并不安全。当用户长时间没 有使用他的电脑,或者将电脑遗弃、转让了,而保存于其中的Cookie仍然是有效的,这就为用户和网站带来潜在的风险。

要解决这个问题,我们可以在数据库中增加一个字段,用以记录自动登录的过期日。这样,是否执行自动登录就不再以客户端的Cookie有效期为准,而 是以服务器端数据库中的信息为准。当我们想要调整用户自动登录的有效期的时候,只需要修改数据库中相应的日期字段即可,因而这一过程变得更加安全。

c# 自动登录网站 由于每天开机都需要登录一个网站, 最近就用c#写了个自动登录网址的程序,原理:使用 webrequest进行post请求; 步骤如下: 1. 使用 火狐的插件啊 firebug,拦截网络请求,查看请求的格式,这里以登录51testing为例,下图的底部“源代码” 就是post的信息,等会在代码中照着写上即可; 3. 贴代码: using Syst 阅读详情

相关推荐

详解C#Session的用法

主要介绍了C#Session的用法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

C#中的Session

简单理解C#中的Session Session是一个缓存机制,它存储数据在服务端,当客户端(浏览器)关闭时即销毁,如果在长时间在使用浏览器未关闭的情况下,默认自动销毁时间为20分钟。Session中存储服务端的数据可以直接传递到服务端。而使用服务端数据优点是比较便捷,代码 比较少,缺点是数据容易丢失,缓存时间比较短。因此用Session的对象保存用户数据的方法效率低,对于小量的用户数据。使用Session是一个不错的选择。 Session有以下的几种特点: Session中的数据保存在服务端; Ses

weixin_52606263的博客 5676

C# 调用 Cefsharp浏览器获取登录后的cookie

有些网站post登录很难,但是我们需要登录后的cookie,那么可以从浏览器入手。 这个是C#调用Cefsharp,手工登录后,获取cookie的例子。

C#Session的用法详细介绍

Session模型简介 在学习之前我们会疑惑,Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每 个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用 户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。   这个唯一的SessionI...

Unknowncheats的博客 3105

asp.net操作cookie

NET有很多种语言组成,比如C#、 VB.NET、J#、Jsript、Managed C++,但是都是运行在.NET FrameWork Run Time底下的。在ASP.NET中,我们会遇到像Session,Application以及Cache这些对象,为了有效地在web应用中有效地使用它们,理解他们之间的不同对我们来说非常重要。C#是一种最新的、面向对象的编程语言。session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过去与否可以在cookie生成的时候设置进去。

aoxiangchina的博客 891

【ASP.NET】ASP.NETsessioncookie的区别和联系

Cookie译小甜饼,是网页浏览器用来保存用户信息的文件,也就是一小段文本,可以保存比如用户是谁,购物车有哪些商品等。 Session会话,会话是指我们访问网站的一个周期。 比如用户打开一个浏览器访问某个位的站点。 在这个站点点击多个超链接查看各个网页,然后关闭浏览器,整个过程称之为一个会话。 两个都可以用来存私密的东西,同样也都有有效期的说法。 区别在于。 session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过期与否可以在cookie生成的时候设置进去。 cookie

GreAmbWang的博客 651

cache、sessioncookie

cache、sessioncookie的区别 session把数据保存在服务器端,每一个用户都有属于自己的Session,与别人的不冲突 就是说,你登陆系统后,你的信息(如账号、密码等)就会被保存在服务器上一个单独的session中,当你退出系统后服务器就会丢掉这个session,你的数据也就没了,必须再次登陆,如果登陆超时也会被丢掉,要看人家系统是怎么设置的了。 Cookie同sessio...

weixin_33826268的博客 260

【ASP.NET】Web中的Cookiesession详解(读取写入区别)

【ASP.NET】Web中的Cookiesession 声明:仅为个人理解,有空请参观迷恋自留地 两者的区别 cookiesession 的区别: 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上...

混迹自留地 617

Asp.net mvc4 登陆信息采用CookieSession技术保存的快速Demo

第一步: 创建C#,mvc4,基本项目,名称为:CookiePassDemo 第二步: 在Models目录下下,创建类文件UserInfo.cs: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel.DataAnno...

格码老师教编程 1649

.NET实现页面间的参数传递 QueryString\Application\Session\Cookie

1. 使用QueryString变量     QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。   下面是一个例子: a.aspx的C#代码 private void Button1_Click(object sender, S

jhaixy5210的专栏 1543

asp.net(c#) Cookie 实现

做了个网站的登陆,开始的时候用的是session ,但是session 丢失数据问题严重,就一秒钟,数据马上就没了 ,真是很头同。找了很多文章,一直没解决的办法,因为用的Access 数据库,都说在web.config中配置一下,但是依旧不省事,用听朋友说一session安全系数低,一般情况下不用,只好改用Cookie 了 ,在CSDN 上搜了一搜,整理了一下: 写入Cookie H...

aigu6370的博客 170

C#Session创建和使用

C#中使用Session的方法步骤 开发工具与技术:工具:Visual Studio/c#,技术:C# 作者:刘胜 撰写时间:2019-02-13 一、简单了解C#中的Session Session是一个缓存机制,存储在服务端,当客户端(浏览器)关闭时即销毁。若长时间不使用且浏览器未关闭的情况下, 默认自动销毁时间为20分钟。可以使Session储存服务端的数据传递到客服端,起了桥梁连接的作用...

weixin_44548643的博客 1万+

cookiesession 的区别详解

这些都是基础知识,不过有必要做深入了解。先简单介绍一下。 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie 里的内容来判断使用者,送出特定的网页内容给你。 Cookie 的使用很普遍

longfulong的专栏 315

ASP.NETSession实现用户登录

ASP.NETSession实现用户登录 首先创建三个Web窗体并分别命名为 CratWeb ShopCart UserLogin 1、在 CratWeb.aspx 中操作如下代码 <form id="form1" runat="server"> <div> <asp:CheckBox ID="CheckBox1" runat=...

weixin_43550660的博客 5107

c#Session 的知识总结

Session的使用 让我们先来实践一下如何使用Session,进而回答第二个问题:Session存储的类型限制。Session不需要进行任何配置就可以使用(默认是InProc模式并且依赖Cookie)。首先,在页面上建立两个按钮。 在btn_WriteSession按钮的Click事件处理方法中,写入两个Session,一个是简单的字符串,另外一个是自定义的类。 protected

kankankankan2222的专栏 4902
上一篇: http响应的状态值
下一篇: 在线将网页存储为pdf
pmandy
博客等级 码龄17年 13粉丝 155原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值