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

Windows Server 2016 部署AD RMS 阅读详情
 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);
        }
    }

}

绝对旋转编码器学习笔记(基本原理,与PC通信等,不定期更新中) 前言 最近开始学习编码器相关内容,目的在于搞清楚编码器的原理,与上位机的联系等问题。笔记资料来源为网络,整理的同时也会有一些总结和感悟。由于研究方向需求,主要研究数字旋转编码器。 1.编码器的定义 编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。——摘自《百度百科》 通常来说,编码器可以将角度位移、直线位移、转速等物理量转换为电信号。这里的电信号根据不同原理的编码器输出脉冲、二进制数码等不同的类型,下面会提到。 2.编码器的分类 编. 阅读详情

相关推荐

Spring AI 实战:5 分钟搭建你的第一个 AI 应用(含完整代码)

能力关键 API适用场景基础对话简单问答、文本生成流式输出实时打字机效果@Bean模型需要调用外部工具结构化输出需要返回 Java 对象多轮对话聊天机器人场景Spring AI 让 Java 开发者可以用最熟悉的方式(Spring Boot + Maven)进入 AI 应用开发领域,不用学新语言,不用换框架,这是它最大的优势。但目前为止,我们的 AI 应用只能回答"它脑子里已有的知识"。如果让它读懂你自己的技术文档、公司内部知识库呢?这就是下一篇文章的主题——RAG(检索增强生成)实战。

qq_17204557的博客 644

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

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

weixin_29055699的博客 1344

WS2812呼吸灯效果实战:用STM32的PWM+DMA实现流畅渐变(附完整代码)

本文详细介绍了如何使用STM32的PWM+DMA技术实现WS2812呼吸灯效果,提供完整的代码示例和调试技巧。通过PWM波形编码和DMA传输机制,解决了传统IO模拟控制方式的高CPU占用问题,实现了流畅的LED渐变效果,适用于各种嵌入式开发场景。

weixin_30566063的博客 454

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

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

qq_52250966的博客 2万+

Pixel 4/4 XL 刷机小白必看:Magisk Root 全流程详解(附电信网络适配技巧)

本文为Pixel 4/4 XL用户提供了一份详尽的Magisk Root全流程指南。从解锁Bootloader、刷入Magisk,到解决电信网络VoLTE适配问题,再到隐藏Root以通过银行App检测,手把手教你安全获取系统最高权限并优化日常使用体验。

weixin_29310605的博客 268

libcurl库使用详情、libcurl库的制作

​ libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。libcurl的官网 、库下载。这种库使用的时候就像使用wiringPi库一样,编写完代码需要链接这个库,所以要先下载这个库。libcurl的使用(其实和socket编程时一样,都需要一定的步骤):

qq_45698138的博客 5338

RMS概念解析与使用指南

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

凯尔探索 2628

出现 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the 解决方法

Access to XMLHttpRequest at 'http://127.0.0.1:5000/api/data' from origin 'http://10.197.0.79:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

码农研究僧的博客 1万+

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

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

weixin_33787529的博客 612

SAP-MM-采购过账接口(与WMS集成)-代码

1、判断传入值非空检验; 2、判断过账日期是否允许在当前期间; 3、判断是否为集采订单业务,是否审批完成; 4、判断是否发布标准成本发布(此业务场景与价格控制3+S有关) 5、保存日志表; 6、判断业务公司订单审批状态; 7、创建STO交货单、集采公司订单过账、STO公司间创建交货单、交货单过账(两步法)、过账失败回滚(冲销交货、删除交货单、冲销集采入库)

qq_32198063的博客 421

EtherCAT主站SOEM -- 18 --Qt-Soem通过CSV模式(周期同步速度模式)控制一个电机转圈圈

以上就是 EtherCAT主站SOEM – 18 --Qt-Soem通过CSV模式(周期同步速度模式)控制一个电机转圈圈 的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 1212

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

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

mingjava的专栏 3352

在iPad上使用Python进行编程

如果你拥有一台iPad,并且想在上面编写和运行Python代码,你会发现iPad提供了一些适用的工具和应用程序来满足你的需求。安装一个Python解释器应用程序,编写和运行Python代码,使用第三方库和模块,以及存储和共享代码,这些步骤将帮助你在iPad上进行Python编程。要在iPad上运行Python代码,首先需要安装一个Python解释器。这些应用程序提供了一个交互式的开发环境,允许你编写、编辑和运行Python代码。一旦你安装了Python解释器应用程序,你可以开始编写Python代码了。

2301_79366435的博客 4628

[技术分享 - RMS 篇] 如何在企业域环境内简化 RMS 认证过程

在企业域环境内,当客户端首次使用RMS时,会弹出以下窗口要求用户验证:我们需要选择”Use a Microsoft Windows account”,因为客户端是在企业内部。接着输入用户名以及密码。然后才能使用Office的RMS功能。但是,以上操作往往会给用户带来麻烦。我们能不能给用户更好的使用体验呢? 答案是肯定的,其实只要把RMS的URL加入到IE的Local int

微软大中华区安全博客 2634

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

自动记录上次登陆成功的用户信息

         站在用户的角度来思考问题,用户需要的永远是方便、快捷的操作功能,所以有些时候自动记录上次登陆成功的用户名和密码也就不可避免了。         以下代码实现了这个功能,把上次登陆成功的用户名和密码记录在RMS里,因为RMS是保存在ROM里的,具有断电非易失性。        private class TextForm extends Form implements Co

大道至简 1994

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: 实例论证J2ME的事件传输机制
下一篇: J2ME学习之温故而知新篇
mingjava
博客等级 码龄24年 68粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值