非功能性需求文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、密码输错6次锁定用户。
首先在用户表里添加一个字段来记录输错密码的次数,当用户登录时,若输错一次密码,就把输错次数加1,直到输错6次后再登录则提示用户已锁定,此时必须联系系统管理员重置此用户密码,并把输错次数置0,才能再次登录。实现代码如下:
public String usrCheck(Map paramMap)
{
String backStr = "";
String userId = (String) paramMap.get("userId");
String password = (String) paramMap.get("password");
MaUser maUser = (MaUser) commonDAO.getObj(MaUser.class,
userId.trim());
if (maUser == null)
{
return"userNotExist";
}
else
{
int errorTimes = maUser.getErrorTimes() == null ? 0 : new
Integer(maUser.getErrorTimes().toString());
if (errorTimes == 6)
{
return"error6";
}
else
{
if(Base64.Base64Encode(password).equals(maUser.getPasswd()) || password.equals(maUser.getPasswd()))
{
maUser.setErrorTimes(new Integer(0));
commonDAO.updateObj(maUser);
backStr = maUser.getUserName() + "@" +
maUser.getUserType();
}
else
{
maUser.setErrorTimes(new Integer(errorTimes + 1));
commonDAO.updateObj(maUser);
return"wrongPwd";
}
}
}
return backStr;
}
2、同一用户无法在两个或两个以上不同PC登录。
实现方法:
用户登录时,会创建一个session,用于保存用户信息,将所有用户登录时的session值与ID存入ServletContext中。
1. 登录:
先从ServletContext中取出存放用户登录的session 相关信息,检查这个列表,如果已经存在相同的登录信息,则说明用户已经登录。
2.监听:
实现SessionListener类,当session失效的时候,从ServletContext中移除相应记录。
登陆部分:
ServletContext context = getSession().getServletContext();
HashMap s_map = (HashMap) context.getAttribute("session_MAP");
if (s_map == null)
{
s_map = new HashMap();
}
Iterator iter = s_map.entrySet().iterator();
boolean login = false;
while (iter.hasNext())
{
Map.Entry entry = (Map.Entry) iter.next();
if (entry.getKey().toString().equals(user.getUserId())
&& !entry.getValue().toString().equals(getSession().getId())) {
login = true;
break;
}
}
if (login)
{
log.warn("用户:" + userId.trim() + " 登陆失败,该用户已在其它地方登陆");
outJsonString(jsonBackStrHelper("登陆失败,该用户已在其它地方登陆", "false"));
}
else
{
s_map.put(user.getUserId(), getSession().getId());
context.setAttribute("session_MAP", s_map);
getSession().setAttribute("user", user);
getSession().setAttribute("userId", user.getUserId());
("用户:" + userId.trim() + " 登录系统成功");
outJsonString(jsonBackStrHelper("", "true"));
}
监听部分:
public class SessionListener implements HttpSessionListener
{
public void sessionCreated(HttpSessionEvent arg0)
{
}
public void sessionDestroyed(HttpSessionEvent arg0)
{
HttpSession session = arg0.getSession();
ServletContext context = session.getServletContext();
HashMap s_map = (HashMap) context.getAttribute("session_MAP");
if (s_map == null)
{
s_map = new HashMap();
}
s_map.remove(session.getAttribute("userId"));
Iterator iter = s_map.entrySet().iterator();
while (iter.hasNext())
{
Map.Entry entry = (Map.Entry) iter.next();
if (entry.getValue().toString().equals(session.getId()))
{
s_map.remove(entry.getKey().toString());
}
}
context.setAttribute("session_MAP", s_map);
}
}
用户注销时只需调用getSession().invalidate()方法即可。
页面关闭时,也需要注销用户。
function forceLogout()
{
//判断点击关闭按钮、任务栏右击关闭、Alt+F4、Ctrl+W
if(((event.clientX+20)>(document.body.clientWidth-20)&&
event.clientY<0)|| event.clientY>document.body.clientHeight ||
event.altKey || event.ctrlKey)
{
Ext.Ajax.request({
url :'loginAction_doLogout.action',