PDA

View Full Version : جلوگیری از ورود همزمان دو کاربر



asgari2005
سه شنبه 04 اردیبهشت 1386, 01:11 صبح
سلام
چگونه میتوان از ورود همزمان دوکاربر با یک نام کاربری جلوگیری کرد البته برای این کار می دانم یک جدول برای کاربران آنلاین می سازم و وقتی کاربری وارد سیستم گردید نام کاربری را در آن جدول درج میکنم و وقتی که کاربر از سیستم به طور عادی خارج گردید رکورد متناظرش را حذف می کنم ولی وقتی برنامه دچار bug شد و به طور ناخواسته از برنامه خارج شد و یا حتی کامپیوتر reset شد و یا کاربر از طریق task manager برنامه را بست رکورد کاربر در جدول باقی می ماند که باید به طور دستی آن رکورد را حذف کنم تا کاربر مورد نظر بتواند وارد سیستم شود
در واقع مشکل من این است که اگر کاربر به طور غیر معمول از برنامه خارج شد این را بفهم و رکود متناظرش را حذف کنم

ali_kolahdoozan
سه شنبه 04 اردیبهشت 1386, 02:26 صبح
ایراد رو باهات مخالفم چون باید با try cash مدیریتش کنی .

moradidn
سه شنبه 04 اردیبهشت 1386, 03:58 صبح
یک روش اینست که در زمان ورود کاربر ابتدا یک Select بصورت زیر بزنید:

Select UserId From OnlineUsers with(nolock) where UserId='کد کاربر'
اگر رکوردی برگردانده شد که به کاربر اجازه ورود به سیستم را نمیدهید.
اگر رکوردی برگردانده نشد پس از آغاز نمودن Transaction کد کاربر را در جدول کاربران آنلاین Insert نموده و بدون Commit نمودن Transaction به کاربر اجازه ورود به سیستم را میدهید.
حالا اگر کاربر بخواهد بصورت عادی از سیستم خارج شود قبل از خروج Transaction را RollBack نمائید که در این حالت رکوردی که Insert نموده بودید از جدول حذف خواهد شد و در ورود بعدی مشکلی بوجود نخواهد آمد.
زمانیکه خروج و یا Disconnect غیرعادی اتفاق بیافتد چون Transaction هنوز Commit نشده است عملیات RollBack بطور خودکار انجام خواهد شد.
البته این روش ایرادات خاص خود را دارد!

MH2538
سه شنبه 04 اردیبهشت 1386, 08:05 صبح
سلام
برای پوشش دادن حالت هایی نظیر همونهایی که خودت گفتی (خروج غیر قابل پیش بینی برنامه)
می تونی یه تابع به توابعت اضافه کنی روش کار هم ایتنطور باشه :
1- هر کاربری که کانکت می شه رو به Table اضافه کنی (همون روش خودت)
2- یک Deadline برای هر تماس در نظر بگیری .مثلا هر کاربر یک ساعت می تونه وصل باشه اما بعد از یک اتصال اون رو قطع نکنی بلکه با یه تابع(همون تابعی که گفتم باید اضافه کنی) چک کنی اگر کاربر هنوز وصل بود Deadline اون رو تمدید کنی و در غیر اینصورت رکورد مربوط به اون رو از جدول کاربرهای فعال حذف کنی.
البته این کار مقداری سربار برای شبکه و سیستم مرکزی ایجاد می کنه
3- می تونی برنامه سمت سرور رو بصورت WebApplication بنویسی و اون رو روی IIS اجرا کنی و با استفاده از Session فعال بودن کاربر های رو کنترل کنی. که در این صورت باید WebService و یا Net Remoting. بلد باشی

asgari2005
سه شنبه 04 اردیبهشت 1386, 10:14 صبح
سلام با تشکر از نظرات دوستان ولی مسئله ای که اینجا مهم است اینکه در هر دو روش گفته شده برای بیش از 100client فکر کنم جواب نمی دهد سربار زیادی روی شبکه و sql server ایجاد می کند من فکر کنم راههای بهتر از این هم وجود دارد

MH2538
سه شنبه 04 اردیبهشت 1386, 11:20 صبح
سلام
دوست عزیز
در روشی که خدمتتون گفته بودم یه روش مبتنی برIIS بود.
این روش هیچ سرباری روی شبکه ایجاد نمی کنه بلکه از مدیریت Session بهره می گیرد .ضمن اینکه امنیت رو هم همراه خودش داره.
Session هم که کاربردهاش به همه ثابت شده.

asgari2005
سه شنبه 04 اردیبهشت 1386, 18:56 عصر
دوست گرامی برنامه به صورت win application می باشد پیشنهاد شما برای سیستم های web application کاربرد دارد که من با استفاده از session عمل جلوگیری را انجام بدهم

MH2538
چهارشنبه 05 اردیبهشت 1386, 07:23 صبح
سلام
دوست عزیز قصد اصرار و پافشاری روی روشی که خدمتتون گفتم ندارم ، اما شما با استفاده از remoting یا با استفاده از webservice می تونید برنامه ای بنویسید که سمت سرور از نوع web application و سمت کلاینت از نوع win application باشد.
نیازی نیست که هر دو سمت win base یا web base باشند.

Sorenaa_s
چهارشنبه 05 اردیبهشت 1386, 10:54 صبح
شما می تونید کنترل کنید که روی هر workstation به طور همزمان فقط یک نسخه از نرم افزار شما اجرا بشه. از طرفی زمان login کاربر چک کنید که اگر از قبل رکوردی مربوط به این کاربر با همان hostname وجود دارد، اجازه ورود بدید جون حتما بار آخر به مشکلی برخورد کرده بوده که رکورد باقی مونده. این راه تا حد خیلی زیادی مشکل رو حل می کنه.

شکارچی
پنج شنبه 03 خرداد 1386, 01:36 صبح
اگر نرم افزار شما تحت شبکه است
بهترین راه برای کنترل این که کاربران online هستند و صدور مجوز login استفاده از یک server application است. server application را روی سرور نصب کن. بعد هر کلاینتی که بخواهد login کند توی user های سرور اضافه می شود. برای ارتباط بین کلاینت ها و سرور باید از windows socket استفاده کنی و از پروتکل TCP/IP. هیچ نیازی به ذخیره کردن user ها در DB نیست. در server application هم user ها در memory ذخیره می شوند. حالا هر وقت که ارتباط یک کلاینت با سرور قطع شد(چه از طریق logout چه از طریق error و exception) سوکت بین کلاینت و سرور هم disconnect می شود. و سرور آنرا از لیست user ها در می آورد.

اگر اطلاعات بیشتری می خواهی mail بزن

hasan_esfahan
شنبه 13 بهمن 1386, 22:31 عصر
میتوانید زمانی که برنامه لود می شود جدول تون را خالی کنید و سپس عملیات دیگر را انجام دهید

ali_karimi68

خدایا فرج آقا نزدیک بفرما