真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java代碼屏蔽 java遮蔽

Java 編程語(yǔ)言中的口令屏蔽

目前 對(duì)于 Java 命令行基于文本的輸入/輸出 API 的批評(píng)之一就是它缺乏對(duì)命令行輸入口令屏蔽的支持 如果借助 AWT/Swing 這便不再成為問題 因?yàn)?AWT/Swing 提供了可以提供屏蔽口令的方法

創(chuàng)新互聯(lián)公司制作網(wǎng)站網(wǎng)頁(yè)找三站合一網(wǎng)站制作公司,專注于網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)站設(shè)計(jì),企業(yè)網(wǎng)站搭建,網(wǎng)站開發(fā),建網(wǎng)站業(yè)務(wù),680元做網(wǎng)站,已為1000+服務(wù),創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)將一如既往的為我們的客戶提供最優(yōu)質(zhì)的網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷推廣服務(wù)!

年 月 我發(fā)表了本文的早期版本 其后便不斷收到大量感謝信 建設(shè)性的意見和在應(yīng)用程序中使用源代碼的許可 本文

概述了口令屏蔽描述了用于口令屏蔽的 AWT/Swing 實(shí)用程序?yàn)槊钚休斎肟诹钇帘螁栴}提供獨(dú)立于平臺(tái)的解決方案為口令屏蔽提供一個(gè)改進(jìn)的解決方案(可靠而安全)

口令屏蔽

登錄屏幕和登錄對(duì)話框使用口令屏蔽技術(shù) 這種技術(shù)要么在輸入口令時(shí)隱藏口令 要么顯示一個(gè)字符(比如星號(hào) * )來代替用戶輸入的字符 例如 當(dāng)您在一臺(tái) Windows 機(jī)器上進(jìn)行登錄時(shí) 一個(gè)登錄對(duì)話框?qū)?huì)呈現(xiàn)在您眼前 其中的口令一欄使用星號(hào)作為屏蔽或回顯字符

如果操作系統(tǒng)是 UNIX 則登錄屏幕中的口令欄不顯示回顯字符 它的做法很簡(jiǎn)單 就是什么都不顯示

AWT/Swing 中的口令屏蔽

如果您希望為您的應(yīng)用程序提供圖形化的登錄對(duì)話框 您可以使用 AWT 的 TextField 類 該類是一個(gè)文本組件 允許編輯單行文本 為了屏蔽口令欄 要使用 setEchoChar 方法 例如 為了把回顯字符設(shè)置為星號(hào) 您需要這樣做

TextField password = new TextField( );password setEchoChar( * );

基于所使用字體的平均字符寬度 數(shù)字 指定了文本欄的寬度 您可以把回顯字符設(shè)置為任何您喜歡的字符 注意 如果您把它設(shè)置為 這意味著輸入將會(huì)被回顯 而不會(huì)被屏蔽

在 Swing 中 您可以使用 JPasswordField 它允許編輯單行文本 視圖表明正在輸入內(nèi)容 但是不會(huì)顯示原始字符 JPasswordField 類與和 setEchoChar 一起使用的 AWT 的 TextField 是源代碼兼容的 如果您使用 JPasswordField 默認(rèn)的回顯字符是星號(hào) * 但是您可以將其修改為任何您選定的字符 此外 如果您把回顯字符設(shè)置為 這意味著字符將在輸入時(shí)顯示出來 而不會(huì)被屏蔽 圖 顯示了一個(gè) Swing 登錄對(duì)話框 其中的回顯字符被設(shè)置為 # 使用的是下面的代碼片斷

JPasswordField password = new JPasswordField( );password setEchoChar( # );

命令行輸入屏蔽

和 AWT/Swing 不同 在 Java 中沒有特殊的 API 可用于屏蔽命令行輸入 這也是許多開發(fā)人員一直所要求的一項(xiàng)功能 如果您希望為命令行基于文本的 Java 應(yīng)用程序以及服務(wù)器端 Java 應(yīng)用程序提供一個(gè)登錄屏幕 它就很有用 提供這種功能的一種方式就是使用 Java 本地接口(Java Native Interface JNI) 對(duì)于不了解 C/C++ 或者希望堅(jiān)持 % 純 Java 代碼的某些 Java 開發(fā)人員來說 這可能有一定難度

這里我針對(duì)這個(gè)問題提出一個(gè)解決方案 在本文的早期版本中 所使用的是一個(gè) UNIX 風(fēng)格的登錄屏幕 口令根本不在屏幕上回顯 這樣做的具體方法是 讓一個(gè)單獨(dú)的線程通過重寫和打印口令提示命令行 嘗試擦除回顯到控制臺(tái)的字符 大家仍然可以從論壇下載該篇文章中專用的代碼和改進(jìn)后的代碼

然而 大家最需要的功能之一是使用星號(hào) * 替換回顯的字符 因此 本文從為口令屏蔽提供一個(gè)簡(jiǎn)單的解決方案開始 接著給出改進(jìn)后的 更加可靠和安全的代碼

簡(jiǎn)單的解決方案

這個(gè)解決方案使用一個(gè)單獨(dú)的線程 在輸入回顯字符的時(shí)候擦除它們 然后使用星號(hào)代替它們 這是使用 EraserThread 類來完成的 如代碼示例 所示

代碼示例 EraserThread java

import java io *;

class EraserThread implements Runnable {?? private boolean stop;

/**??? *@param The prompt displayed to the user??? */?? public EraserThread(String prompt) {?????? System out print(prompt);?? }

/**??? * Begin masking display asterisks (*)??? */?? public void run () {????? stop = true;????? while (stop) {???????? System out print( \ * );???????? try {??????????? Thread currentThread() sleep( );???????? } catch(InterruptedException ie) {??????????? ie printStackTrace();???????? }????? }?? }

/**??? * Instruct the thread to stop masking??? */?? public void stopMasking() {????? this stop = false;?? }}

注意 這個(gè)解決方案廣泛利用了線程 然而 如果機(jī)器負(fù)載很重 就不能確保 MaskingThread 能夠足夠經(jīng)常地運(yùn)行 請(qǐng)繼續(xù)閱讀本文的余下部分來了解代碼的改進(jìn)版本

PasswordField 類使用了 EraserThread 類 這一點(diǎn)在代碼示例 中體現(xiàn)出來了 這個(gè)類提示用戶輸入口令 而且 EraserThread 的一個(gè)實(shí)例嘗試使用 * 屏蔽輸入 注意 一開始將顯示一個(gè)星號(hào) (*)

代碼示例 PasswordField java

public class PasswordField {

/**??? *@param prompt The prompt to display to the user??? *@return The password as entered by the user??? */?? public static String readPassword (String prompt) {????? EraserThread et = new EraserThread(prompt);????? Thread mask = new Thread(et);????? mask start();

BufferedReader in = new BufferedReader(new InputStreamReader(System in));????? String password = ;

try {???????? password = in readLine();????? } catch (IOException ioe) {??????? ioe printStackTrace();????? }????? // stop masking????? et stopMasking();????? // return the password entered by the user????? return password;?? }}

作為如何使用 PasswordField 類的一個(gè)例子 考慮應(yīng)用程序 TestApp 如示例代碼 所示 這個(gè)應(yīng)用程序顯示一條提示 并等待用戶輸入口令 當(dāng)然 輸入被屏蔽為星號(hào)(*)

代碼示例 TestApp java

class TestApp {?? public static void main(String argv[]) {????? String password = PasswordField readPassword( Enter password: );????? System out println( The password entered is: +password);?? }}

如果您在 Windows MacOS 或 UNIX 操作系統(tǒng)上運(yùn)行 TesApp 您將會(huì)發(fā)現(xiàn)其輸出與圖 類似 此外還要注意 當(dāng)您運(yùn)行該應(yīng)用程序時(shí) 會(huì)顯示一個(gè)初始的星號(hào)

使代碼安全而可靠

上述的簡(jiǎn)單解決方案有一個(gè)主要缺陷 不應(yīng)該使用字符串來存儲(chǔ)諸如口令這類敏感信息!在本文的余下部分中 將會(huì)給出一個(gè)經(jīng)過改進(jìn)的解決方案

然而 首先 MaskingThread 類能夠從幾處改進(jìn)中獲益

為了確保跨線程的可見性 尤其是在多 CPU 的機(jī)器上 stop 字段應(yīng)該被標(biāo)記為 volatile volatile 關(guān)鍵字指定同步線程使用該字段 這樣編譯器就不會(huì)對(duì)它進(jìn)行任何優(yōu)化 換句話說 應(yīng)該從內(nèi)存讀取變量的值 而不應(yīng)該在堆棧中保存任何拷貝

為了確保屏蔽能夠在系統(tǒng)高負(fù)荷運(yùn)轉(zhuǎn)時(shí)也能夠出現(xiàn) 在調(diào)用持續(xù)期間 調(diào)用線程的優(yōu)先權(quán)被設(shè)定為最大 返回時(shí)再恢復(fù)其原始的優(yōu)先權(quán)

代碼示例 顯示了修訂后的 MaskingThread 類 修改的地方均以粗體形式突出顯示

import java io *;

/*** This class attempts to erase characters echoed to the console */

class MaskingThread extends Thread {?? private volatile boolean stop;?? private char echochar = * ;

/**?? *@param prompt The prompt displayed to the user?? */?? public MaskingThread(String prompt) {????? System out print(prompt);?? }

/**?? * Begin masking until asked to stop ?? */?? public void run() {

int priority = Thread currentThread() getPriority();????? Thread currentThread() setPriority(Thread MAX_PRIORITY);

try {???????? stop = true;???????? while(stop) {?????????? System out print( \ + echochar);?????????? try {????????????? // attempt masking at this rate????????????? Thread currentThread() sleep( );?????????? }catch (InterruptedException iex) {????????????? Thread currentThread() interrupt();????????????? return;?????????? }???????? }????? } finally { // restore the original priority???????? Thread currentThread() setPriority(priority);????? }?? }

/**?? * Instruct the thread to stop masking ?? */?? public void stopMasking() {????? this stop = false;?? }}

盡管使用 Strings 收集和存儲(chǔ)口令看起來似乎很合邏輯 它們并不適合存儲(chǔ)諸如口令這樣的敏感信息 這是因?yàn)?Strings 類型的對(duì)象是不可改變的——使用后不能重寫或修改字符串的內(nèi)容 應(yīng)該使用一個(gè) chars 數(shù)組作為代替 修訂后的 PasswordField 如代碼示例 所示 它是根據(jù) Using Password Based Encryption 改寫而來

代碼示例 PasswordField java

import java io *;import java util *;

/*** This class prompts the user for a password and attempts to mask input with * */

public class PasswordField {

/**?? *@param input stream to be used (e g System in)?? *@param prompt The prompt to display to the user ?? *@return The password as entered by the user ?? */

public static final char[] getPassword(InputStream in String prompt)??? throws IOException {

MaskingThread maskingthread = new MaskingThread(prompt);????? Thread thread = new Thread(maskingthread);????? thread start();

char[] lineBuffer;????? char[] buf;????? int i;

buf = lineBuffer = new char[ ];

int room = buf length;????? int offset = ;????? int c;

loop:?? while (true) {???????? switch (c = in read()) {??????????? case :??????????? case :?????????????? break loop;

case \r :?????????????? int c = in read();?????????????? if ((c != ) (c != )) {????????????????? if (!(in instanceof PushbackInputStream)) {???????????????????? in = new PushbackInputStream(in);????????????????? }????????????????? ((PushbackInputStream)in) unread(c );??????????????? } else {????????????????? break loop;??????????????? }

default:?????????????????? if ( room ) {????????????????????? buf = new char[offset + ];????????????????????? room = buf length offset ;????????????????????? System arraycopy(lineBuffer buf offset);????????????????????? Arrays fill(lineBuffer );????????????????????? lineBuffer = buf;?????????????????? }?????????????????? buf[offset++] = (char) c;?????????????????? break;???????? }????? }????? maskingthread stopMasking();????? if (offset == ) {???????? return null;????? }????? char[] ret = new char[offset];????? System arraycopy(buf ret offset);????? Arrays fill(buf );????? return ret;?? }}

最后 PasswordApp 類如代碼示例 所示 它只是一個(gè)用于測(cè)試修訂后代碼的測(cè)試應(yīng)用程序

代碼示例 PasswordApp java

import java io *;

lishixinzhi/Article/program/Java/hx/201311/25934

java程序可以屏蔽瀏覽器長(zhǎng)時(shí)間沒響應(yīng)的提示嗎

不能,java程序不能直接控制瀏覽器的行為,只能通過瀏覽器的API來調(diào)用瀏覽器的功能,而瀏覽器的長(zhǎng)時(shí)間沒響應(yīng)的提示是瀏覽器自身的一個(gè)功能,java程序無法控制。

java 中怎樣將屏蔽掉的代碼拆起來

編程的初期可以把checkStyle、findBugs這些都disable掉。因?yàn)闄z查代碼都是后期的工作,首先要讓程序能夠跑起來,然后再考慮效率問題,最后才考慮代碼格式等次重要的東西。

一般來說checkStyle的警告都是可以不予理睬的,比如說name hides a field、magic number,對(duì)你編程沒有影響。但是對(duì)開發(fā)軟件產(chǎn)品來說,這個(gè)是最后必須要消除的。因?yàn)檫@將影響你寫的代碼的可讀性,進(jìn)而影響到將來代碼優(yōu)化和維護(hù)。

name hides a field警告指方法的參數(shù)和類里面定義的域(或者說是成員變量,數(shù)據(jù)成員)重名了,換個(gè)其他名字就行了,比如說name改為n。

magic number就是指程序里那些不用取變量名,直接把常量值寫在使用它的地方的那種數(shù)字。這種數(shù)字往往讓人摸不著頭腦,也不知道那是什么意義,就像毫無原因,突然被變出來的一樣,所以被稱為“魔術(shù)數(shù)字”。

解決magic number的方法就是把所有用到的常量都聲明為public static final,

注釋是相當(dāng)重要的,即使是自己開發(fā)的,時(shí)間久了也許都會(huì)忘記某個(gè)變量是用來干什么的……

在JAVA中輸入什么代碼才能屏蔽非法字符

只能輸入數(shù)字:“^[0-9]*$”只能輸入n位的數(shù)字:“^\d{n}$”只能輸入至少n位數(shù)字:“^\d{n,}$”只能輸入m-n位的數(shù)字:“^\d{m,n}$”只能輸入零和非零開頭的數(shù)字:“^(0|[1-9][0-9]*)$”只能輸入有兩位小數(shù)的正實(shí)數(shù):“^[0-9]+(.[0-9]{2})?$”只能輸入有1-3位小數(shù)的正實(shí)數(shù):“^[0-9]+(.[0-9]{1,3})?$”只能輸入非零的正整數(shù):“^\+?[1-9][0-9]*$”只能輸入非零的負(fù)整數(shù):“^\-[1-9][0-9]*$”只能輸入長(zhǎng)度為3的字符:“^.{3}$”只能輸入由26個(gè)英文字母組成的字符串:“^[A-Za-z]+$”只能輸入由26個(gè)大寫英文字母組成的字符串:“^[A-Z]+$”只能輸入由26個(gè)小寫英文字母組成的字符串:“^[a-z]+$”只能輸入由數(shù)字和26個(gè)英文字母組成的字符串:“^[A-Za-z0-9]+$”只能輸入由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串:“^\w+$”


文章題目:java代碼屏蔽 java遮蔽
轉(zhuǎn)載來源:http://weahome.cn/article/dojscpe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部