浏览 2175 次
锁定老帖子 主题:xml 记录 用户访问记录
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-27
最后修改:2010-04-27
两个页面一个登录一个显示!利用IO流读本地磁盘里面的文件,用户名和密码! 要求: 1登陆次数累加 2记录每次的IP与时间
我的思路:使用xstream 持久化对象到xml文件中,每次判断的时候再反序列化到内存,做相应的逻辑判断。 但是我总觉得效率很低,每次验证都要重新读取xml文件
xml 文件: 登陆用户名密码文件root.xml <users> <user> <user> <username>ysen2</username> <password>123</password> </user> <user> <username>ysen</username> <password>123</password> </user> </user> </users>
日志文件userloginfo.xml <root> <userLogInfos> <userLogInfo> <userName>ysen</userName> <loginInfos> <loginInfo> <ip>127.0.0.1</ip> <loginTime>2010-04-27 03:38:46.781 CST</loginTime> </loginInfo> <loginInfo> <ip>127.0.0.1</ip> <loginTime>2010-04-27 03:40:55.921 CST</loginTime> </loginInfo> <loginInfo> <ip>127.0.0.1</ip> <loginTime>2010-04-27 03:44:13.187 CST</loginTime> </loginInfo> <loginInfo> <ip>127.0.0.1</ip> <loginTime>2010-04-27 03:45:45.281 CST</loginTime> </loginInfo> <loginInfo> <ip>127.0.0.1</ip> <loginTime>2010-04-27 04:14:41.125 CST</loginTime> </loginInfo> </loginInfos> <count>29</count> </userLogInfo> <userLogInfo> <userName>ysen2</userName> <loginInfos> <loginInfo> <ip>192.168.0.1</ip> <loginTime>2010-04-27 02:24:07.609 CST</loginTime> </loginInfo> <loginInfo> <ip>192.168.0.2</ip> <loginTime>2010-04-27 02:24:07.609 CST</loginTime> </loginInfo> </loginInfos> <count>20</count> </userLogInfo> </userLogInfos> </root>
主要业务代码:
package com.ysen; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.util.Iterator; import java.util.List; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class LogManager { private static String filePath = "d:/userloginfo.xml"; private static String rootPath = "d:/root.xml"; public static String getFilePath() { return filePath; } public static void setFilePath(String filePath) { if (filePath != null && !filePath.equals("")) { LogManager.filePath = filePath; } } public static String getRootPath() { return rootPath; } public static void setRootPath(String rootPath) { LogManager.rootPath = rootPath; } private static XStream xstream = new XStream(new DomDriver());// 不需要XPP3库 static { // 序列化一个对象到XML xstream.alias("userLogInfo", UserLogInfo.class); xstream.alias("loginInfo", loginInfo.class); xstream.alias("root", Root.class); xstream.alias("users", Users.class); xstream.alias("user", ValidUser.class); } private LogManager() { } public static XStream getInstance() { if (xstream != null) { return xstream; } return new XStream(new DomDriver()); } public static boolean validPassword( User user){ /* Users users = new Users(); ValidUser validuser1 = new ValidUser(); validuser1.setUsername("ysen"); validuser1.setPassword("123"); ValidUser validuser2 = new ValidUser(); validuser2.setUsername("ysen2"); validuser2.setPassword("123"); users.addUser(validuser2); users.addUser(validuser1); FileOutputStream fs = null; try { fs = new FileOutputStream("d:/root.xml"); } catch (FileNotFoundException e) { e.printStackTrace(); } xstream.toXML(users, fs); return true;*/ boolean flag = false; FileInputStream fis = null; try { fis = new FileInputStream( rootPath ); } catch (FileNotFoundException e) { e.printStackTrace(); } Users users = (Users) xstream.fromXML(fis); List user_sub = users.getUsers(); for (Iterator iterator = user_sub.iterator(); iterator.hasNext();) { ValidUser validUser = (ValidUser) iterator.next(); if (validUser.getUsername()!=null && validUser.getUsername()!=""&&validUser.getUsername().equals(user.getUsername())&& validUser.getPassword().equals(user.getPassword())) { flag = true; } } FileOutputStream fs = null; try { fs = new FileOutputStream( rootPath ); } catch (FileNotFoundException e) { e.printStackTrace(); } xstream.toXML(users, fs); return flag; } public static void validata(User user) { /* * 验证用户名与密码 */ if(!validPassword( user)){ return ; } FileInputStream fis = null; try { fis = new FileInputStream( filePath ); } catch (FileNotFoundException e) { e.printStackTrace(); } Root root = (Root) xstream.fromXML(fis); List userloginInfos = root.getUserLogInfo(); for (Iterator iterator = userloginInfos.iterator(); iterator.hasNext();) { UserLogInfo userlogin = (UserLogInfo) iterator.next(); if (userlogin.getUserName().equals(user.getUsername())) { // 登陆次数累加1 userlogin.addCount(); // 添加ip 与 登陆时间 loginInfo entry = new loginInfo(); entry.setIp(user.getIp()); entry.setLoginTime(user.getTime()); userlogin.add(entry); } } FileOutputStream fs = null; try { fs = new FileOutputStream( filePath ); } catch (FileNotFoundException e) { e.printStackTrace(); } xstream.toXML(root, fs); } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-28
不了解LogManager上层封装有没有同步,至少单看这部分代码会有IO争抢的问题。
频繁解析、构造xml效率很要命。 可以尝试利用Log的xml输出,比如log4j的XmlLayout,既解决并发也解决效率。 |
|
返回顶楼 | |
发表时间:2010-04-30
Foxswily 写道 不了解LogManager上层封装有没有同步,至少单看这部分代码会有IO争抢的问题。
频繁解析、构造xml效率很要命。 可以尝试利用Log的xml输出,比如log4j的XmlLayout,既解决并发也解决效率。 可以通过加锁的方式,解决线程安全的问题,但是怎么才能解决xml存储的时候数据丢失的问题了? |
|
返回顶楼 | |
发表时间:2010-05-24
不讨论,但是第一感觉就是xml太臃肿了
如果是我,我会改为下面这样,可以节约很多空间的,最好连空格,换行也去掉 ---------------------- <users> <u i="1" n="a" p="a" /> <u i="2" n="b" p="b" /> </users> |
|
返回顶楼 | |