MiniOA开发过程记录(33)-自动登录模式
2011-09-25 20:49
393 查看
讨论地址:http://www.minioa.net/viewtopic.php?f=7&t=256
此前,我们已经讨论过网页自动登录http://www.minioa.net/viewtopic.php?f=6&t=19&p=29。
这里,我们讨论的是MiniOA系统内如何实现自动登录。登录需要用户名和密码,我们选择将用户名和密码加密后传给一个网页,然后实现自动登录,也就是通过一个网址来自动登录系统。
例如我通过http://localhost:8080/minioa /autologin.jsf?url=231293a51b134f92a77ceb4409ca39de8e6ded038e3d019063581fea83904219fa2e5c88c42410c92f95290927c7000b680a621a5fb1511c1f4ffc5d1d10d29506d2060b18d7a4f7821e48cb7de5393a18584867be7f2255f0a4ebf1d95c3ff95eb62fbc504573c71ffa85948b822328 来登录系统。
为什么考虑使用自动登录?企业内网中的用户可能会觉得总是输入用户名和密码会比较麻烦,当然一般用户倒是不必关心,要是老板提出这样的要求,那就得考虑了。
上面这个网址只有一个参数url,显然它是加密的,包含了用户名、密码还有ip地址,只要通过这个网址,而且是自己的电脑(自己的ip),那么就允许通过。我们可以将这个链接添加到收藏夹。
我们定义一个属性autoLogin,将判断的代码放置其getter中,这样就可以在autologin.xhtml中以
方式来执行自动登录的代码。
代码的逻辑,首先判断是否登录,如果登录了就不继续执行,如果没有登录就取得参数url的值,解密,判断是否包含三段字符串,如果是就进而判断传递过来的ip是否和当前ip一致,如果一致就使用用户名和密码登录,登录成功后就设置session数据。
private String autoLogin;
public String getAutoLogin() {
try {
String url;
if (!"true".equals(getMySession().getIsLogin())) {
Map params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
url = (String) params.get("url");
String passwordKey = FunctionLib.getWebParameter("passwordKey");
url = new Blowfish(passwordKey).decryptString(url);
String[] arr = url.split(";");
if(arr.length==3){
String name = arr[0];
String pwd = arr[1];
String ip = FunctionLib.getIp();
if (ip.equals(arr[2])) {
Query query = getSession().getNamedQuery("core.user.autologin");
query.setParameter("userName", name);
query.setParameter("password", pwd);
if ("1".equals(String.valueOf(query.list().get(0)))) {
query = getSession().getNamedQuery("core.user.getrecordbyusername");
query.setParameter("userName", name);
Iterator it = query.list().iterator();
while (it.hasNext()) {
Object obj[] = (Object[]) it.next();
if ("1".equals(FunctionLib.getString(obj[14])))
return "";
getMySession().setUserId(FunctionLib.getInt(obj[0]));
getMySession().setDepaName(FunctionLib.getString(obj[16]));
getMySession().setEmail(FunctionLib.getString(obj[9]));
getMySession().setDisplayName(FunctionLib.getString(obj[13]));
getMySession().buildOpList(getSession());
getMySession().buildTopMenu();
getMySession().buildLeftMenu();
}
it = null;
getMySession().setUserName(name);
getMySession().setIsLogin("true");
System.out.println(name + " auto login at time " + FunctionLib.dtf.format(new java.util.Date()) + ", ip is " + ip);
} else
System.out.println(name + " attempt to auto login at time " + FunctionLib.dtf.format(new java.util.Date()) + ", ip is " + ip);
} else
System.out.println(name + " auto login at time " + FunctionLib.dtf.format(new java.util.Date()) + ", ip is incorrect");
}
}
url = FunctionLib.getWebAppName();
if ("".equals(url))
url = "http://" + FunctionLib.getRequestHeaderMap("host") + "/";
else
url = "http://" + FunctionLib.getRequestHeaderMap("host") + "/" + url;
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.sendRedirect(url);
} catch (Exception ex) {
ex.printStackTrace();
}
return "";
}
我们在修改个人资料页面中来生成自动登录的网址
//取得web.xml中的passwordKey参数
String passwordKey = FunctionLib.getWebParameter("passwordKey");
String userName = prop.get("userName");
String password = prop.get("password");
//取得网站名称
String url = FunctionLib.getWebAppName();
if ("".equals(url))
url = "http://" + FunctionLib.getRequestHeaderMap("host") + "/autologin.jsf?url=";
else
url = "http://" + FunctionLib.getRequestHeaderMap("host") + "/" + url + "/autologin.jsf?url=";
prop.put("url", url + new Blowfish(passwordKey).encryptString(userName + ";" + password + ";" + FunctionLib.getIp()));
new Blowfish(passwordKey).encryptString(userName + ";" + password + ";" + FunctionLib.getIp())执行加密。
修改密码后,这个加密的网址需要重新生成。
此前,我们已经讨论过网页自动登录http://www.minioa.net/viewtopic.php?f=6&t=19&p=29。
这里,我们讨论的是MiniOA系统内如何实现自动登录。登录需要用户名和密码,我们选择将用户名和密码加密后传给一个网页,然后实现自动登录,也就是通过一个网址来自动登录系统。
例如我通过http://localhost:8080/minioa /autologin.jsf?url=231293a51b134f92a77ceb4409ca39de8e6ded038e3d019063581fea83904219fa2e5c88c42410c92f95290927c7000b680a621a5fb1511c1f4ffc5d1d10d29506d2060b18d7a4f7821e48cb7de5393a18584867be7f2255f0a4ebf1d95c3ff95eb62fbc504573c71ffa85948b822328 来登录系统。
为什么考虑使用自动登录?企业内网中的用户可能会觉得总是输入用户名和密码会比较麻烦,当然一般用户倒是不必关心,要是老板提出这样的要求,那就得考虑了。
上面这个网址只有一个参数url,显然它是加密的,包含了用户名、密码还有ip地址,只要通过这个网址,而且是自己的电脑(自己的ip),那么就允许通过。我们可以将这个链接添加到收藏夹。
我们定义一个属性autoLogin,将判断的代码放置其getter中,这样就可以在autologin.xhtml中以
<h:outputText value="#{User.autoLogin}" />
方式来执行自动登录的代码。
代码的逻辑,首先判断是否登录,如果登录了就不继续执行,如果没有登录就取得参数url的值,解密,判断是否包含三段字符串,如果是就进而判断传递过来的ip是否和当前ip一致,如果一致就使用用户名和密码登录,登录成功后就设置session数据。
private String autoLogin;
public String getAutoLogin() {
try {
String url;
if (!"true".equals(getMySession().getIsLogin())) {
Map params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
url = (String) params.get("url");
String passwordKey = FunctionLib.getWebParameter("passwordKey");
url = new Blowfish(passwordKey).decryptString(url);
String[] arr = url.split(";");
if(arr.length==3){
String name = arr[0];
String pwd = arr[1];
String ip = FunctionLib.getIp();
if (ip.equals(arr[2])) {
Query query = getSession().getNamedQuery("core.user.autologin");
query.setParameter("userName", name);
query.setParameter("password", pwd);
if ("1".equals(String.valueOf(query.list().get(0)))) {
query = getSession().getNamedQuery("core.user.getrecordbyusername");
query.setParameter("userName", name);
Iterator it = query.list().iterator();
while (it.hasNext()) {
Object obj[] = (Object[]) it.next();
if ("1".equals(FunctionLib.getString(obj[14])))
return "";
getMySession().setUserId(FunctionLib.getInt(obj[0]));
getMySession().setDepaName(FunctionLib.getString(obj[16]));
getMySession().setEmail(FunctionLib.getString(obj[9]));
getMySession().setDisplayName(FunctionLib.getString(obj[13]));
getMySession().buildOpList(getSession());
getMySession().buildTopMenu();
getMySession().buildLeftMenu();
}
it = null;
getMySession().setUserName(name);
getMySession().setIsLogin("true");
System.out.println(name + " auto login at time " + FunctionLib.dtf.format(new java.util.Date()) + ", ip is " + ip);
} else
System.out.println(name + " attempt to auto login at time " + FunctionLib.dtf.format(new java.util.Date()) + ", ip is " + ip);
} else
System.out.println(name + " auto login at time " + FunctionLib.dtf.format(new java.util.Date()) + ", ip is incorrect");
}
}
url = FunctionLib.getWebAppName();
if ("".equals(url))
url = "http://" + FunctionLib.getRequestHeaderMap("host") + "/";
else
url = "http://" + FunctionLib.getRequestHeaderMap("host") + "/" + url;
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
response.sendRedirect(url);
} catch (Exception ex) {
ex.printStackTrace();
}
return "";
}
我们在修改个人资料页面中来生成自动登录的网址
//取得web.xml中的passwordKey参数
String passwordKey = FunctionLib.getWebParameter("passwordKey");
String userName = prop.get("userName");
String password = prop.get("password");
//取得网站名称
String url = FunctionLib.getWebAppName();
if ("".equals(url))
url = "http://" + FunctionLib.getRequestHeaderMap("host") + "/autologin.jsf?url=";
else
url = "http://" + FunctionLib.getRequestHeaderMap("host") + "/" + url + "/autologin.jsf?url=";
prop.put("url", url + new Blowfish(passwordKey).encryptString(userName + ";" + password + ";" + FunctionLib.getIp()));
new Blowfish(passwordKey).encryptString(userName + ";" + password + ";" + FunctionLib.getIp())执行加密。
修改密码后,这个加密的网址需要重新生成。
相关文章推荐
- MiniOA开发过程记录(33)-自动登录模式
- MiniOA开发过程记录(2)-Hell0 World
- MiniOA开发过程记录(7)-JSF2.0/Richfaces/MiniOA开发入门
- MiniOA开发过程记录(1)-安装MyEclipse8.0
- MiniOA开发过程记录(29)-安装Maven
- MiniOA开发过程记录(29)-安装Maven
- 记录mini-task--代理邮件发收系统的开发过程(二)
- JAVAWEB开发之Servlet Filter(过滤器)详解包括post和get编码过滤器、URL访问权限控制、自动登录。以及装饰模式的使用
- 记录mini-task--代理邮件发收系统的开发过程(三)
- 支持多选的邮件自动补全提示插件 - 【第一次插件开发过程记录】
- 记录mini-task--代理邮件发收系统的开发过程(一)
- JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径
- 一个自动登录网页的软件开发过程
- 软件开发过程中的C语言细节记录
- cookie加密解密全过程,使用filter实现自动登录
- 【WebService学习过程记录(四)】xfire开发webservice客户端
- 【Android开发】找乐,一个笑话App的制作过程记录
- Android 手机影音 开发过程记录(五)
- 微信扫码支付模式二功能实现,回调,记录充值,整个完整流程,java开发
- 使用jenkins配置.net mvc5网站自动构建全过程记录