久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

java代碼屏蔽 java遮蔽

Java 編程語言中的口令屏蔽

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

創(chuàng)新互聯(lián)公司制作網(wǎng)站網(wǎng)頁找三站合一網(wǎng)站制作公司,專注于網(wǎng)頁設(shè)計,成都網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)站設(shè)計,企業(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ò)營銷推廣服務(wù)!

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

概述了口令屏蔽描述了用于口令屏蔽的 AWT/Swing 實用程序為命令行輸入口令屏蔽問題提供獨(dú)立于平臺的解決方案為口令屏蔽提供一個改進(jìn)的解決方案(可靠而安全)

口令屏蔽

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

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

AWT/Swing 中的口令屏蔽

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

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

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

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

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

命令行輸入屏蔽

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

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

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

簡單的解決方案

這個解決方案使用一個單獨(dú)的線程 在輸入回顯字符的時候擦除它們 然后使用星號代替它們 這是使用 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;?? }}

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

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

代碼示例 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 類的一個例子 考慮應(yīng)用程序 TestApp 如示例代碼 所示 這個應(yīng)用程序顯示一條提示 并等待用戶輸入口令 當(dāng)然 輸入被屏蔽為星號(*)

代碼示例 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 您將會發(fā)現(xiàn)其輸出與圖 類似 此外還要注意 當(dāng)您運(yùn)行該應(yīng)用程序時 會顯示一個初始的星號

使代碼安全而可靠

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

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

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

為了確保屏蔽能夠在系統(tǒng)高負(fù)荷運(yùn)轉(zhuǎn)時也能夠出現(xiàn) 在調(diào)用持續(xù)期間 調(diào)用線程的優(yōu)先權(quán)被設(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 收集和存儲口令看起來似乎很合邏輯 它們并不適合存儲諸如口令這樣的敏感信息 這是因為 Strings 類型的對象是不可改變的——使用后不能重寫或修改字符串的內(nèi)容 應(yīng)該使用一個 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 類如代碼示例 所示 它只是一個用于測試修訂后代碼的測試應(yīng)用程序

代碼示例 PasswordApp java

import java io *;

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

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

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

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

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

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

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

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

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

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

在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ù):“^[0-9]+(.[0-9]{2})?$”只能輸入有1-3位小數(shù)的正實數(shù):“^[0-9]+(.[0-9]{1,3})?$”只能輸入非零的正整數(shù):“^\+?[1-9][0-9]*$”只能輸入非零的負(fù)整數(shù):“^\-[1-9][0-9]*$”只能輸入長度為3的字符:“^.{3}$”只能輸入由26個英文字母組成的字符串:“^[A-Za-z]+$”只能輸入由26個大寫英文字母組成的字符串:“^[A-Z]+$”只能輸入由26個小寫英文字母組成的字符串:“^[a-z]+$”只能輸入由數(shù)字和26個英文字母組成的字符串:“^[A-Za-z0-9]+$”只能輸入由數(shù)字、26個英文字母或者下劃線組成的字符串:“^\w+$”

分享名稱:java代碼屏蔽 java遮蔽
文章位置:http://sd-ha.com/article34/dojscpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、做網(wǎng)站、網(wǎng)站設(shè)計、品牌網(wǎng)站制作、App設(shè)計、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管