应用RMS实现用户自动登陆功能

Gradle进阶:4:结合Sonarqube进行代码审查 作为代码质量检查的流行工具,比如Sonarqube能够检查代码的“七宗罪”,跟代码结合起来能够更好地提高代码的质量,这篇文章将会介绍如何结合gradle和sonarqube对代码质量与测试覆盖率进行分析。 阅读详情
MIDP的子系统Record Management System提供了MIDlet的持久性存储, 精通MIDP子系统RMS系列文章对其使用进行了详细介绍。本文讲述如何使用RMS提供的功能实现应用程序的定制功能——自动登陆。

    我们的设计思路非常简单,在RecordStore中存储用户的设置和用户的信息(用户名和密码),如果用户选择自动登陆的话,那么下次当用户想联网的时候将跳过登陆界面,系统会从RecordStore中读取用户和密码,经过服务器的验证后转入到适当的界面。我对整个程序进行了简化,我们不进行联网,对信息的存储也都从简,只是为了说明RMS实现应用程序定制的思路,因此给出的代码并没有全面测试和优化。下面是程序的截图

   

 

 

 

 





 

 

     我们用Account和Preference分别存储用户信息和用户的个性化设置,同样在这两个类中提供序列化的方法,这样方便我们从RecordStore中读取和写入。这里只给出Preference类的代码,Account类似。
package com.j2medev.autologin;

import java.io.*;

public class Preference
{
    private boolean autoLogin;

    public Preference(boolean _autoLogin)
    {
        this.autoLogin = _autoLogin;
    }

    public Preference()
    {
    }

    public void serialize(DataOutputStream dos) throws IOException
    {
        dos.writeBoolean(autoLogin);
    }

    public static Preference deserialize(DataInputStream dis)
            throws IOException
    {
        Preference preference = new Preference();
        preference.setAutoLogin(dis.readBoolean());

        return preference;
    }

    public boolean isAutoLogin()
    {
        return autoLogin;
    }

    public void setAutoLogin(boolean autoLogin)
    {
        this.autoLogin = autoLogin;
    }
}

    我们需要一个Model类来处理读取和写入RecordStore数据的逻辑,它也非常简单。为了简化程序我们规定首先写入Account然后写入Preference,这样我们读取的时候只要通过recordID分别为1和2来读取了,在实际使用的时候通常会比较复杂,我们要借助过滤器等查找,可以参考我的基于MIDP1.0实现个人通讯录。

package com.j2medev.autologin;

import javax.microedition.rms.*;
import java.io.*;


public class Model
{
    private RecordStore accountStore;
    public static final String RNAME = "accountstore";

    public Model()
    {
        try
        {
            accountStore = RecordStore.openRecordStore(RNAME, true);
        } catch (RecordStoreException e)
        {
            e.printStackTrace();
        }
    }

    public void closeRecordStore()
    {
        try
        {
            accountStore.closeRecordStore();
        } catch (RecordStoreException e)
        {
            e.printStackTrace();
        }
    }

    public void saveAccount(Account account)
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        try
        {
            account.serialize(dos);
            byte[] data = baos.toByteArray();
            accountStore.addRecord(data, 0, data.length);
            baos.close();
        } catch (IOException e)
        {
            e.printStackTrace();
        } catch (RecordStoreException e)
        {
            e.printStackTrace();
        }

    }

    public Account getAccount(int recordID)
    {

        try
        {
            if (accountStore.getNumRecords() > 0)
            {
                byte[] data = accountStore.getRecord(recordID);
                ByteArrayInputStream bais = new ByteArrayInputStream(data);
                DataInputStream dis = new DataInputStream(bais);
                Account account = Account.deserialize(dis);
                bais.close();
                return account;
            }
            return null;

        } catch (IOException e)
        {
            return null;
        } catch (RecordStoreException e)
        {
            return null;
        }
    }

    public void savePreference(Preference preference)
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        try
        {
            preference.serialize(dos);
            byte[] data = baos.toByteArray();
            accountStore.addRecord(data, 0, data.length);
            baos.close();
           
        } catch (IOException e)
        {
            e.printStackTrace();
        } catch (RecordStoreException e)
        {
            e.printStackTrace();
        }

    }

    public Preference getPreference(int recordID)
    {
        try
        {
            if (accountStore.getNumRecords() > 0)
            {
                byte[] data = accountStore.getRecord(recordID);
                ByteArrayInputStream bais = new ByteArrayInputStream(data);
                DataInputStream dis = new DataInputStream(bais);
                Preference preference = Preference.deserialize(dis);
                bais.close();
                return preference;
            }
            return null;
        } catch (IOException e)
        {
            return null;
        } catch (RecordStoreException e)
        {
            return null;
        }
    }

}

    MIDlet的设计同样很简单,直接给出代码。整个程序的代码可以从这里下载

package com.j2medev.autologin;

import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;


public class LoginMIDlet extends MIDlet implements CommandListener
{

    private Display display;
    private Form loginForm;
    private Form successForm;
    private TextField userName;
    private TextField password;
    private ChoiceGroup autoLogin;
    private Model model;
    public static final Command ConnCMD = new Command("Connect", Command.OK, 1);

    protected void startApp() throws MIDletStateChangeException
    {
        initMIDlet();
        Preference p = model.getPreference(2);
        if (p == null || !p.isAutoLogin())
        {
            display.setCurrent(loginForm);
        } else if (p.isAutoLogin())
        {
            Account account = model.getAccount(1);
            System.out.println("username:" + account.getUsrName() + "password:"
                    + account.getPassword());
            display.setCurrent(successForm);

        }

    }

    public void initMIDlet()
    {
        model = new Model();
        display = Display.getDisplay(this);
        loginForm = new Form("LoginForm");
        userName = new TextField("username", null, 20, TextField.ANY);
        password = new TextField("password", null, 20, TextField.PASSWORD);
        autoLogin = new ChoiceGroup("AutoLogin", Choice.MULTIPLE,
                new String[] { "remember me" }, null);
        loginForm.append(userName);
        loginForm.append(password);
        loginForm.append(autoLogin);
        loginForm.addCommand(ConnCMD);
        loginForm.setCommandListener(this);
        successForm = new Form("OK");
        successForm.append("Ok you have connected to server");
    }

    protected void pauseApp()
    {
     
    }


    protected void destroyApp(boolean arg0) throws MIDletStateChangeException
    {

    }

    public void commandAction(Command arg0, Displayable arg1)
    {
        String _userName;
        String _password;
        boolean auto = false;

        if (arg0 == ConnCMD)
        {
            _userName = userName.getString();
            _password = password.getString();
            auto = autoLogin.isSelected(0);
            System.out.println(_userName + _password + auto);
            if (auto)
            {
                Account account = new Account(_userName, _password);
                model.saveAccount(account);
                Preference preference = new Preference(auto);
                model.savePreference(preference);

            }
            display.setCurrent(successForm);
        }
    }

}

BTW:上边的设计中对recordID考虑得不是很完善,实际编写代码的时候应该修正。

CARLA 0.9.15从零开始:环境搭建与基础场景实战指南 本文是CARLA 0.9.15从零开始的完整环境搭建与基础运行教程。详细介绍了在Linux系统下配置Python环境、下载安装CARLA核心软件包、启动服务器以及运行第一个基础场景的步骤。重点演示了如何通过Python客户端脚本生成随机车流,并手动控制EGO车辆在仿真城市中行驶,为自动驾驶算法开发构建了坚实的仿真测试基础。 阅读详情

相关推荐

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3324

域 文件服务器 rms加密,客户端登录域后访问RMS加密文件依然提示输入用户名和密码...

近日做RMS实验,虚拟环境:一台win2003 DC+exchange+CA,RMS服务器为win2008遇到如下问题:1、域用户在winxp客户端登录域后访问RMS加密的office word文档,提示输入用户名和密码,即使选择记住密码也无法解决。请问该如何解决?2、在搭i建RMS服务器时,选择“使用ssl加密连接”,指定群集地址完全限定的域名为http://rmsserver.****.com...

weixin_29055699的博客 1344

TSMaster实战:如何用LIN总线唤醒你的汽车电子系统(附波形分析)

本文通过TSMaster工具实战解析LIN总线唤醒机制。详细介绍了LIN网络唤醒的协议要求、时序参数计算,并演示了如何在TSMaster中配置唤醒信号、捕获分析波形,以及验证休眠流程。文章结合常见问题排查,为汽车电子工程师提供了从理论到实践的完整调试指南。

weixin_28308325的博客 459

常见的厂商设备默认管理用户名和密码

分享常见的默认用户名和密码

qq_52250966的博客 2万+

神经元细胞结构刨析(持续更新)

神经细胞的学习笔记

weixin_46596227的博客 2220

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 408

权限管理服务(RMS)相关点滴

  对敏感数字信息进行保护是各种类型和规模的组织机构都需要共同关注的一项重要安全任务。随着信息化在企业中的不断深入,对保护数字信息的需求也变得更为强烈。Rights Management Service是一种与应用程序协作来保护数字内容生存周期的安全技术,专为那些需要保护的敏感文档、Web 内容、电子邮件进行设计。用户可以严格控制哪些用户可以打开、读取、修改和重新分发特定的内容。 ...

weixin_30746117的博客 738

RTKlib操作手册--使用样例数据演示

本文将使用样例数据演示如何使用RTKLIB进行rtk差分定位。

samur2的博客 7775

AD RMS服务器部署(一)RMS安装

微软的RMS(Rights Management Services 版权管理服务)服务器可以保护企业内的重要文件,授权只有特定用户才能访问这些文件(当然文件服务器的权限也可以做到这一点)。RMS还可以允许文件不能被复制,打印,转发,甚至离开了公司就无法打开这些文件(这些功能靠文件服务器的权限就无法实现了吧,EFS也无能为力)。 RMS要求用户每次打开文件,都要在RMS服务器上申请凭据,然后才能打...

weixin_33787529的博客 612

EMB电子机械制动系统和EHB电子液压制动系统控制功能的对比

EMB电子机械制动系统相比EHB液压制动系统具有显著优势:响应速度更快(<100ms)、控制精度更高(±2N·m)、能实现单轮独立控制,支持0.1%级制动力调节。在ABS、ESC等安全功能上表现更优,制动平顺性和NVH性能更好,同时提升能量回收效率15%-20%。特别适合智能驾驶需求,可使AEB等系统响应时间缩短50ms,紧急制动距离减少1米以上。EMB系统完美契合高阶自动驾驶对快速响应和精准控制的要求。

m0_59012156的博客 885

Pointnet++改进90:2025最新改进模块-EVA模块

本教程提出了一种改进PointNet++特征提取模块的方法,通过在PointNetSetAbstraction模块中加入NAMAttention注意力机制,显著提升了模型性能。具体改进包括:1)新建eva.py文件,实现了包含SDLSKA、CKS等关键组件的EVA模块;2)在pointnet2_utils.py中添加Conv和PointNetSetAbstractionAttention类,整合注意力机制;3)修改pointnet2_sem_seg.py模型结构。这种改进方法降低了实现难度,同时保持了33F

AIcurator的博客 361

RMS概念解析与使用指南

RMS(Record Management System)是MIDP中一个非常重要的子系统,因为它是J2ME应用程序进行持久性存储的唯一途径。当然你的系统如果支持JSR75的话,那么你可以使用FileConnection来对文件进行操作,那超出了本文的讨论范围。持久性存储在我们编写应用程序的时候经常要用到,比如纪录游戏的排行榜、记录用户输入的用户名和密码等。本文将主要从RMS的基本概念和使用指南方

凯尔探索 2628

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 384

关于用户名验证的方法

从数据库中读取用户名和密码然后和输入的进行验证,并不是使用如果两者相等怎么怎么样,而是说,先假设数据库中已经有了你输入了的用户名和密码,然后从数据库中读取,获得结果集,如果数据库里没有,那么返回孔,如果数据库里有,那么结果集的指针就会停留在第一行之前,然后条用next()方法,就可以将指针移到第一行,从而返回true,实例如下:· public static boolean checkLogin

zhouyufei0001的博客 1409

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Record Management System从入门到精通系列之三

   前面两篇文章详细的介绍了Record Management System的基本概念以及对象序列化的问题,现在我们主要介绍关于RecordStore类的使用,在SUN的网站提供了一个RMSAnalyzer类,你可以把他用在你的项目中来调试你的程序。 Record Store Discovery       你可以通过调用RecordStore.listRecordStores()来得到MIDl

mingjava的专栏 3350

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

非域用户使用RMS需要设置服务器地址

客户端如果没有加入域,若使用RMS来进行权限服务的话,工作组模式下的用户只有15分钟的信任时间,但这需要通过修改注册表来实现,因为你需要获取SCP对象: 客户端需要修改以下两个注册表键值 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Common\DRM KeyName:CorpCertificationServer KeyTy

rheostat的专栏 3813

ADRMS权限管理服务器(二)---权限应用

Microsoft Office是支持RMS的应用程序,任何用户访问通过RMS保护后的Office文档,都需要经过RMS服务器的验证,从而获取到相应的权限,现再来实现这样一个场景,我们用用户jqq来对一个文档做限制,允许用户zj允有更改文档的权限,允许用户wxt仅能对文档进行查看 首先通过用户jqq登录到计算机 XP需要安装RMS客户端WindowsR...

weixin_34366546的博客 287

登录登出,自动登录

UserLoggingDao: public interface UserLoggingDao { // 根据账号获取用户信息 User findByAccount(String account); } UserLoggingDaoImpl: public class UserLoggingDaoImpl implements UserLoggingDao{ @Override...

白墨的小白博客 920

安装配置RMS服务器步骤

安装配置RMS服务器步骤 RMS服务器管理配置 一.安装RMS服务的硬件和软件要求: 建议硬件要求: Dual processors " 512 MB RAM " 40 GB free hard disk space " NIC 软件要求 Windows Server 2003 fami...

weixin_34026484的博客 976

设置windows自动登录

以前是用优化大师设置,可是换用64位系统之后不生效了。新的解决方法是: 首先同时按下“Windows+R”快捷键调出运行命令窗口,然后在窗口中输入“control userpasswords2”后回车。这时Windows 7中的用户帐号(User Accounts)窗口会自动弹出,紧接着去掉“Users must enter a user name and password to use

nicekwell的专栏 617

如何使用RMS对文档权限进行限制

一. 安装 首先在“文件”-“权限”中点击“不能分发”,第一次使用的时候会提让需要下载安装RMS组件WindowsRightsManagementServicesSP2-KB917275-Client-CHS-x86。安装步骤很简单。 二. 增加文档限制 再次点击“不能发送”,首先会验证你对这个文档的权限,然后就会打开权限设置页面。 这里可以设置“读取”和“更改”。使用...

weixin_34220834的博客 1428
上一篇: Tomcat和Apache整合【转载】
下一篇: 你最需要注意的11条要点for C++[转]
皮鲁
博客等级 码龄23年 44粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值