如何解决重复签到的问题

fskjb01 2010-03-29 08:47:28
在一个考勤模块中有一个签到页面,当用户登录系统后就跳到该页面,当用户点击签到则把签到时间记录到数据库中。

考虑到有重复登录的问题,我在session设置了一个变量来记录用户是否已经签到,这样当用户签到后跳到其他模块再跳回来
时签到按钮是不可用的,只能点签退,然后才能再次签到。

但还有一种情况是,用户登录点签到后,立刻点击浏览器的后退,退到登入界面,再点前进按钮回到签到页面,这是签到按钮就不在是禁用的,这样就产生重复签到。请问怎么解决这个问题啊。

代码如下:

private ManualSignServices manualsign = new ManualSignServices();
private UserInfo userinfo = null;

protected void Page_Load(object sender, EventArgs e)
{
DateTime currentTime = DateTime.Now.ToString();
txtSignDate.Text =currentTime.ToString();
txtSignInDesc.Text = null;

if (Session["hassignin"] == null || (Boolean)Session["hassignin"] == false)
{
btnArrive.Enabled = true;
btnLeave.Enabled = false;
}
else {
btnArrive.Enabled = false;
btnLeave.Enabled = true;
}
}
protected void btnArrive_Click(object sender, EventArgs e)
{
userinfo = Session["currentUser"] as UserInfo;
int sid = manualsign.SignIn(userinfo.UserId, currentTime, txtSignDesc.Text, 1);
FskjbModel.ManualSign m = manualsign.GetSignMessage(sid);
txtUserId.Text = userinfo.UserId;
txtUserName.Text = userinfo.UserName;
txtUserDepart.Text = userinfo.DepartName;
txtUserBranch.Text = userinfo.BranchName1;
txtSignInDesc.Text = m.Signdesc;
lblSignInTime.Text = m.Signtime.ToString();
fieldSignIn.Visible = true;
fieldSignOut.Visible = false;
btnArrive.Enabled = false;
btnLeave.Enabled = true;
Session["hassignin"] = true;



}
protected void btnLeave_Click(object sender, EventArgs e)
{
userinfo = Session["currentUser"] as UserInfo;
int sid = manualsign.SignOut(userinfo.UserId, currentTime, txtSignDesc.Text, 0);
FskjbModel.ManualSign m = manualsign.GetSignMessage(sid);
txtUserId2.Text = userinfo.UserId;
txtUserName2.Text = userinfo.UserName;
txtUserDepart2.Text = userinfo.DepartName;
txtUserBranch2.Text = userinfo.BranchName1;
txtSignOutDesc.Text = m.Signdesc;
lblSignOutTime.Text = m.Signtime.ToString();
fieldSignOut.Visible = true;
fieldSignIn.Visible = false;
btnArrive.Enabled = true;
btnLeave.Enabled = false;
Session["hassignin"] = false;

}

...全文
1321 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸭梨山大帝 2010-03-29
  • 打赏
  • 举报
回复
Session是进程级别的,一旦浏览器关闭就失效了,如果我同时开两个页面来签到怎么办呢?
光Session是不够的.

既然你把签到时间都保存到了数据库了,为何不保存一个签出时间呢?

进入页面-->签到(签到时间写入数据库)-->签出正常退出(签出时间写入数据库)
弄一个心跳包程式,一定频率去告诉服务器该用户在线,当超过频率触发时间服务器未接受到心跳包就表示用户当出现异常(用户未签出就关闭页面 或者 页面崩溃 或者 死机 等等情况)
此时服务器在后台自动写入签出时间

用户在未签出时,在其他地方进行登录或者双开页面登录,服务器进行验证,如果只有签到时间,无签出时间就不让其他登录
wuyq11 2010-03-29
  • 打赏
  • 举报
回复
在一定时间范围内签到
记录数据到数据如用户签到时间
方便考勤统计
心蓝168 2010-03-29
  • 打赏
  • 举报
回复
在数据库做好相应的记录

每次进入页面查询一下该用户是否已签到,如果已签到,按扭不可用

每次签到时查询一下该用户是否已签到,如果已签到,就不再签到,操作取消,刷新按扭状态

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧