java实现弹出认证输入框(弹出一个带有用户名和密码输入的对话框)

java如何实现如题的效果,效果图如下:

这个效果让我很好奇,这个效果类型与在ftp服务器上下载需要登录认证的文件时会弹出这个框,在网上查阅了一些资料,不过相关的资料真的很少,找到了一些关键的技术点自己简单的实现了下,下面是一些简单的介绍,来源于http://www.blogbus.com/gaomed-logs/106179012.html

标签: TAG: 用户登录框是怎么做的;路由器的用户登录框是怎么做的;通用的用户登录框;authenticate验证;Authorization验证

/*****************************************************************************

**

**    文档:www-authenticate认证过程简单研究

**

**    创建:http://hi.baidu.com/netee

**

**    日期:2009-10-07

**

**    版权:原创内容,转载请注明出处,并保留本声明信息

**

******************************************************************************/

一、www-authenticate简介

www-authenticate是早期的一种简单的,有效的用户身份认证技术。

很多网站验证都采用这种简单的验证方式来完成对客户端请求的数据的合法性进行验证。尤其在嵌入式领域中,此方法使用较多。

缺点:这种认证方式在传输过程中是明码传输的,采用的用户名密码加密方式为BASE-64,其解码过程非常简单,网络上很容易搜索到编解码的源码。采用这种认证方式对于普通用户是较安全的,但稍懂TCP/IP协议和HTTP传输协议和验证过程的,破解这种验证用户名和密码是非常简单的。所以其认证技术并不是很安全。

二、认证过程

其基本认证过程如下(以下事例假设服务端开启了www-authenticate认证功能):

1、 首先客户端(一般情况为用户操作的WEB浏览器)会根据用户输入的信息向服务端发送HTTP请求,比如用户要访问www.baidu.com网站,浏览器根据此信息向该网站的服务器发送一个(可能是多个)WEB请求。

2、  服务端收到请求后,首先会解析发送来的数据中是否包含有:

“Authorization: Basic YWRtaW46YWRtaW4=”这种格式的数据,如果没有这样的数据,则服务端会发送HTTP信息头“WWW-Authenticate:
Basic realm=“.””到客户端,要求客户端发送合法的用户名和密码到服务端。(在发送此信息头的同时也附带验证失败时显示的页面提示信息,如:

3、 当客户端(浏览器)收到带有类似“WWW-Authenticate: Basic realm=“.””的信息后,将会弹出一个对话框,要求用户输入验证信息。

4、 用户输入用户名:admin
密码:admin后,浏览器将以下面这种格式将数据发送给服务器端:

“Authorization: Basic YWRtaW46YWRtaW4=”(以上均不包含双引号)Authorization: Basic为www-authenticate认证的标准HTTP信息头,YWRtaW46YWRtaW4=是经BASE-64加密后的用户名和密码,经解密后的格式为
admin:admin

5、 服务器收到带有用户验证信息的数据后,就会解析数据,将用户名和密码提取出来进行验证其有效性,如果用户名和密码全部合法,则将用户请求的页面数据发送给客户端,浏览器将收到的数据还原为网页内容。如果用户验证信息不合法,则返回错误信息。

三、使用www-authenticate认证的优缺点

优点:使用www-authenticate认证,在服务端做的事情较少,有一部分验证处理都是在客户端的浏览器完成的。像是否需要二次输入用户信息,弹出怎样的用户信息对话框,这些都是浏览器做的事,服务端并不需要再编写用户对话框之类的东西,也不需要判断客户端IP是否是同一个。

缺点:验证方式太简单,容易被破解。

标签: TAG: 用户登录框是怎么做的;路由器的用户登录框是怎么做的;通用的用户登录框;authenticate验证;Authorization验证

大致看下上面的介绍就行了,本文主要论述用java来实现这个效果,先贴出源码,大家可以自行拷贝:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Decoder;

public class DemoServlet extends HttpServlet {

	private static final long serialVersionUID = 887846383437110578L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取到的内容是结果base64编码后的字符串,所以这样的认证方式安全性不高
		String authValue = request.getHeader("Authorization"), //获取到的请求头格式类似于 Basic MTIzOjEyMw==
			   username = null,
			   pwd = null;
		if(authValue != null){
			BASE64Decoder decoder = new BASE64Decoder();
			String[] values = new String(decoder.decodeBuffer(authValue.split(" ")[1])).split(":"); //通过解析后的用户名和密码格式例如 123:123
			if(values.length == 2){
				username = values[0];
				pwd = values[1];
			}
		}
		//用户名和密码都不为空时验证成功
		if(username != null && username.length() >0
				&& username.equals(pwd)){
			response.setContentType("text/html; charset=UTF-8");
			response.getWriter().print("你已经通过验证!");
		}else{ //未通过验证
			response.setStatus(401); //设置好相应的状态
			response.setHeader("WWW-Authenticate", "Basic realm=\"My Application\"");

			//设置用户取消验证后的消息提示
			response.setContentType("text/html; charset=UTF-8");
			response.getWriter().print("HTTP STATUS -- 401!");
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

先说下上面的技术点,主要是一些http请求和响应的一些操作,通过设置http状态为401,以及设置头WWW-Authenticate,来告诉浏览器,访问需要相关的验证,于是浏览器就弹出这样一个对话框,让用户输入用户名和密码,如果验证退出了,浏览器则会显示请求体的相关内容。

时间: 2024-10-12 08:50:09

java实现弹出认证输入框(弹出一个带有用户名和密码输入的对话框)的相关文章

用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)

     用PopupWindow实现弹出菜单是一个比较好的方式.当然我们还有一个类PopupMenu也能实现弹出菜单,但那个太过于局限了,所以不是很推荐. 这个实例的效果是这样的:点击按钮后,一个菜单从屏幕的右边滑入到屏幕中,点击按钮/空白处后菜单消失. 布局文件时一个按钮,我就不贴出代码了.下面是菜单的布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&

ASP.NET—013:实现带控件的弹出层(弹出框)

在页面中用到弹出新页面的情况比较多的,一般来说都是使用JS方法showModalDialog("新页面相对路径+?参数1&参数2",window,"新页面样式");然后会新弹出一个模态的page页.而在有些时候,仅仅是显示一些单一的.少量的数据,或者一些简单的操作时.就没必要使用新弹出页面了.此时,最好使用弹出层,也就是数据还是显示在当前页面的某个控件上,然后通过JS方法实现达到弹出的目的.看下面的例子: <html xmlns="http:

Bootstarp学习(二十四)模态弹出框--模态弹出窗的使用

除了通过data-toggle和data-target来控制模态弹出窗之外,Bootstrap框架针对模态弹出框还提供了其他自定义data-属性,来控制模态弹出窗.比如说:是否有灰色背景modal-backdrop,是否可以按ESC键关闭模态弹出窗.有关于Modal弹出窗自定义属性相关说明如下所示: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content=&qu

面遮罩弹出框已经不是一个陌生的话题了,实现的方法大同小异多种多样,今天用jQuery实现页面遮罩弹出

页面遮罩弹出框是最常见的一种情况,今天用jQuery实现页面遮罩弹出框,主要用的技术有JQuery,css和html, html代码如下: 复制代码代码如下: <div id="main"><a href="javascript:showBg();">点击这里查看效果</a> <div id="fullbg"></div> <div id="dialog">

Js弹出层,弹出框代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

fatal: Authentication failed for又不弹出用户名和密码 解决办法

各位,如果能弹出来,一定是你账号密码搞错了,就别继续看了. image.png 切换命令行: image.png 依然报错, 说到这个问题,又可以长篇大论了, 我使用的是tortoisegit,window电脑 平常都是用ppk文件组合 _netrc文件进行登录的,这样设置之后基本上只需要输入密码,不再需要输入用户名就可以上传更新,要节省不少时间 _netrc文件可以自己搜索在C:\Users\Administrator\%username%\_netr下 内容如下: machine git.o

Java_Swing程序设计_尝试开发一个登陆窗体,包括用户名、密码以及提交按钮和重置按钮,当用户输入用户名my,密码love时,弹出登陆成功提示对话框。

package com.lzw; import java.awt.*;import java.awt.event.*; import javax.swing.*; public class UseCase3 extends JFrame{ /** * */ private static final long serialVersionUID = 1L; public UseCase3(){ setVisible(true); setDefaultCloseOperation(WindowCons

关于iPhone/iPad的iOS系统自动弹出认证窗口问题

前言 路由器,认证服务器,手持无线终端.当通过手持无线设备连接到需要认证的WiFi上,会自动弹出窗口,何解?为什么有的时候就不弹出窗口呢?怎么给商家一个合理的解释呢? 验证问题 通过在路由器上抓包来看弹出窗口的时候都发生了什么? 抓包方法如下http://blog.csdn.net/qianguozheng/article/details/32108093 当弹出认证窗口的时候都发生了什么? 当没有弹出认证窗口的时候,没有弹出认证窗口. 原理剖析 https://developer.apple.

【转】关于android的输入法弹出来 覆盖输入框的有关问题

今天发现一个问题,在录入信息页面.信息不多,但是输入法弹起后,内容已经超出页面,无滚动条,很不方便. 解决办法:在配置文件中,页面对应的Activity中添加 <activity android:name="com.XXXActivity" android:windowSoftInputMode="adjustResize" android:screenOrientation="portrait"/> 以下是转的,感谢 hoswat