(评分:★★★ , 回复: 2, 阅读: 1374) 前几天在CSDN看见有人问 www.cn-java.com 网站的登录对话框是怎么实现的。 (相关连接:http://expert.csdn.net/Expert/topic/1833/1833798.xml?temp=.9407923), 然后自己实验了一下,www.cn-java.com的登陆好象是用SSL来传输密码的。 根据帖子里回复的提示, 发现在jsp里写下以下代码: <% response.setStatus(401); response.setHeader("Cache-Control","no-store"); response.setDateHeader("Expires",0); response.setHeader("WWW-authenticate","Basic Realm=\"大富翁论坛用户\""); %> 确实可以实现那样的对话框,但是对话框要出现三次才消失, 可是怎样来获取用户名字和密码呢??? 终于搜索到一篇相关的文章,虽然是PHP的. (可以用 “超越PHP authorization”作为关键字在google搜索,页面已经无法打开了, 我是通过google toolbar在网页里的右键菜单来打开快找的: http://216.239.33.100/search?sourceid=navclient-menuext&q=cache:http%3A//www.hooday.com/manual/features.http-auth.php) 但是通过文章内容可以分析出,确实是可以取出用户名字和密码的, OK,继续搜索(关键字 request.getHeader authorization )。
在java官方论坛找到啦:)
http://forum.java.sun.com/thread.jsp?forum=33&thread=67087&start=0&range=15&hilite=false&q=
全英文,好痛苦,不管它,找我看的懂的, 发现这样一行代码: out.print("authentication:" + request.getHeader("Authentication"));
马上添到自己的测试页面里测试,结果取值是null :(
不怕,我继续搜索,终于发现 Httpheader里的不是 authentication而是authorization 才对。 改了,终于取出值了,是 Basic cXdlcjp0ZXN0,看不懂:(
再查资料,原来是Base64编码的,但我还不能够确定这就是存放的用户名字和密码啊, 怎么办???当然找Base64解码工具啦:)
google居然没有搜索到,不过总算发现了 http://www.csdn.net/cnshare/soft/14/14983.shtm 马上下载,在桌面上新建个文本文档,把cXdlcjp0ZXN0写入,保存。 结果decode仍然是乱码,仔细一看,原来自己没有选中Base64,好了,再来, 解码器生成了个eml格式我文件,Outlook打开还是乱码:(
突然灵机一动,用notepad.exe打开新建 文本文档.eml。 发现里面是固定格式的: Content-Type: text/plain;charset="cn-gb" Content-Transfer-Encoding: BASE64 aaaaaaa
于是把"aaaaaaa"(当时肯定不是这个啦,我已经删除内容了,所以不知道原来的乱码是什么了,随便写点东西表示一下,呵呵) 替换成 “cXdlcjp0ZXN0”,再用outlook打开一看,果然是我刚才输入的"qwer:test", 那么可以确信这就是用户名字和密码了。
剩下的就是用Base64的decode啦,可惜搜索到的几个base64源代码调试有问题。
因为要收拾东西准备回学校,暂时不再接着去摸索了,
先记点笔记在这里,下次找东西也方便点。
另外有种模仿这样的登陆效果(我是指窗口方式)的,但是是利用window.showModalDialog模态方式打开一个页面来实现的。 参考连接:http://www.hexiesoft.com/(打开这个连接可以看到效果) 要查看网页源代码则需要打开 :http://www.hexiesoft.net/hexiesoft/AnonymousAccessibleForms/login.aspx 和 http://www.hexiesoft.net/hexiesoft/AnonymousAccessibleForms/login.htm
今天只是刚摸索了点开头,接下来回学校隔离,等毕业答辩,等毕业,再最后正式上班。
以后有空接着记笔记,呵呵!!!
2003-6-3 18:08:00 查看评语 ?
2003-6-3 18:17:40抓了幅图片,呵呵把源代码先记这里,免得以后找不到了。 (刚才提交不成功,原来大富翁没有在笔记屏蔽html,)
< %@ page contentType="text/html; charset=GBK" % > < % response.setStatus(401); response.setHeader("Cache-Control","no-store"); response.setDateHeader("Expires",0); response.setHeader("WWW-authenticate","Basic Realm=\"大富翁论坛用户\""); % > 本页面演示采用 SSL加密认证的方式来传输密码。 // 参考连接:http://expert.csdn.net/Expert/topic/1833/1833798.xml?temp=.9407923 < % String temppass= request.getHeader("authorization"); if ((temppass!=null)&&(temppass.length()>6)){ out.println("authentication:" + temppass);//经过其它方式验证,此时得到的temppass是Basic加上 Base64之后的编码 //比如我输入的用户名字qwer和密码test则得到qwer:test ,经过编码之后为cXdlcjp0ZXN0,而temppass=Basic cXdlcjp0ZXN0。 % >
2003-6-4 18:18:49Base64解码正确了参考http://www.javaidea.net/java/basic/base64.jsp 把那两个函数放到一个Bean里的了:
package md5demo;
import sun.misc.BASE64Encoder; import sun.misc.BASE64Decoder;
public class base64Bean { public base64Bean() { } publicString getBASE64(String s) { if (s == null) return null; return (new sun.misc.BASE64Encoder()).encode( s.getBytes() ); }
// 将 BASE64 编码的字符串 s 进行解码 publicString getFromBASE64(String s) { if (s == null) return null; BASE64Decoder decoder = new BASE64Decoder(); try { byte[] b = decoder.decodeBuffer(s); return new String(b); } catch (Exception e) { return null; } }
}
Jsp里获取用户买和密码: <% String temppass= request.getHeader("authorization"); String temppassdecode=""; String username=""; String userpass=""; if ((temppass!=null)&&(temppass.length()>6)){ temppass= temppass.substring(6,temppass.length()); out.println("取出来的用户名字和密码base64code为:"+temppass); temppassdecode=base64code.getFromBASE64(temppass); out.println("<br>解码的结果是:"+temppassdecode); } %>
用户名字和密码之间是用冒号":"隔开的,但是如果用户名字或者密码里有冒号存在, 怎么来获取正确的用户名字和密码呢???
正待解决中......
2003-7-16 17:35:51继续ing :)毕业了,正式上班了啦:)
呵呵,自己搞错了些概念,SSL加密传输是必须要有Verisign之类提供的服务器证书才可以。
而jsp里通过设置WWW-authenticate和 BASIC realm(基本验证,用户名字和密码采用Base64加密) 或者Digest realm(摘要验证,密码将会是用md5加密过后的数字). (参考 http://www.cn-java.com/target/news.php?news_id=2217 中的 关于 http 验证 部分)
另,根据以下内容: RFC 2617HTTP AuthenticationJune 1999 except not limited to 76 char/line> user-pass = userid ":" password userid= *<TEXT excluding ":"> password= *TEXT 可以确定用户名字里不能够包含 “:”的。
修改之后的代码如下(解决了即使输入正确的登陆信息,窗口也要出现三次的问题):
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="sun.misc.*"%> <% response.setStatus(401); response.setHeader("WWW-authenticate","Basic realm=\"大富翁论坛用户\""); %> <jsp:useBean id="base64code" scope="request" class="md5demo.base64Bean"/> <html> <head> <title>安全登录的实现</title> </head> <body bgcolor="#ffffff"> <h1> 本页面演示采用 Base64 基本认证加密认证的方式来传输密码。 </h1> <h2> <% String temppass= request.getHeader("authorization"); String temppassdecode=""; String username=""; String userpass=""; if ((temppass!=null)&&(temppass.length()>6)){ out.println("<br>解码前是:"+temppass); temppass= temppass.substring(6,temppass.length()); out.println("取出来的用户名字和密码base64code为:"+temppass); temppassdecode=base64code.getFromBASE64(temppass); out.println("<br>解码的结果是:"+temppassdecode); username=temppassdecode.substring(0,temppassdecode.indexOf(":")); userpass=temppassdecode.substring(temppassdecode.indexOf(":")+1); out.println("<br>用户名字是:"+username); out.println("<br>用户密码是:"+userpass); if (username.equals("lnboy")) { response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-store"); response.setDateHeader("Expires",0); response.setStatus(200); out.println("<br>登陆成功了"); } else{ response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-store"); response.setDateHeader("Expires",0); out.println("<br>你没有登陆"); } } %> </h2> </body> </html>
但是有个问题,验证通过的话,按 F5或者地址栏敲下回车,登陆对话框就不再会出现了, 参考http://www.cn-java.com/tologoff.php 而怎样注销我还没有想到:( 还有其它相关的东西,还在继续摸索中。
...
2003-7-17 8:43:33又发现点,登陆成功之后,F5或者地址栏敲下回车,登陆对话框不能够再出现的原因是: Http header里Authorization不再是空,而已经包含 类似下面的信息了: Authorization: Basic bG5bb3k6NcUxbvIvMjId。
2003-7-20 17:28:15发现基本验证不安全刚才看了www.cn-java.com 登陆之后,打开页面中其它连接的时候, 发出去的Http header里Authorization仍然包含有验证信息, 如果有人用工具获得了Http数据包, 经过Base64解码就可以得到用户的名字和密码, 这样将很不安全。
正在摸索摘要验证的实现,找到几篇RFC文档在看(好久没有看英文,感觉有点吃力) 已经取得一点进展,但是还有很多细节不清楚,有待继续摸索,先放幅图片再说。 呵呵,就不帖代码了。
|
相关推荐
本篇笔记介绍了一个简单的用户注册与登录系统的实现过程,该系统由四个JSP页面构成,分别是`login.jsp`、`test.jsp`、`test2.jsp`以及未给出具体代码的第四个页面。通过这些页面,用户可以进行注册或登录操作,并且...
本书是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习JSP & Servlet时遇到的概念、操作、应用或认证考试等问题及解决方案。 本书针对Servlet 3.0的新功能全面改版,无论是章节架构与范例程序代码,都...
吉林大学珠海学院JSP&Servlet学习笔记(第二版)课后答案 本资源为吉林大学珠海学院JSP&Servlet学习笔记(第二版)的课后答案,涵盖了JSP和Servlet相关的知识点。本笔记共分为九章,每章节都包含了相关的问题答案,...
JSP Servlet 学习笔记 第2版 林信良 随书光盘 第3卷
《JSP & Servlet学习笔记(第2版)》是作者多年来教学实践经验的总结,...《JSP & Servlet学习笔记(第2版)》以“微博”项目贯穿全书,将JSP & Servlet技术应用于实际项目开发之中,并使用重构方式来改进应用程序架构。
第六篇为“Web应用高级专题”,主要讲述Servlet过滤器、JSP异常处理、JSP日志、认证和安全、部署等内容;第七篇为“Web应用开发实例”,围绕一个电子商务网站,从需求分析、架构选取、数据存储、开发、测试及部署等...
**JSP(JavaServer Pages)/Servlet 知识详解** JSP 和 Servlet 是 ...以上就是关于 JSP 和 Servlet 的核心知识点,希望对你学习和理解这些技术有所帮助。通过深入学习和实践,你可以创建出高效、稳定的 Web 应用。
通过阅读这份笔记,你可以了解JSP和Servlet的基本语法、生命周期、以及如何将它们结合使用来创建动态Web应用。同时,HTML格式的文档易于阅读和理解,对于自学非常友好。 在实际学习过程中,你可能还会涉及到Web容器...
**JSP(Java Server Pages)与Servlet...这个**[JSP&Servlet学习笔记(第2版)]**会涵盖这些主题,并可能包括示例代码、最佳实践和常见问题解答,帮助读者全面掌握JSP和Servlet的使用技巧,进一步提升Java Web开发能力。
本资料包“JSP学习笔记”提供了丰富的学习资源,适用于初学者和有一定经验的开发者,用以提升对JSP的理解和应用能力。 ### 1. JSP基本概念 - **页面组成**:JSP页面由静态内容(HTML、CSS、JavaScript)和动态内容...
本学习笔记源码提供了全面的学习资源,涵盖了这两个技术的基础到高级应用,旨在帮助开发者深入理解并熟练掌握JSP和Servlet。 1. **JSP基础**: JSP是一种服务器端的脚本语言,它将HTML、CSS、JavaScript与Java代码...
**JSP学习笔记总结** **第 1 章 JSP 和 Web 页面的交互** 1.1 JSP(JavaServer Pages)是Java技术在Web开发中的应用,它允许开发者将静态HTML与动态Java代码结合起来,生成动态网页。通过在HTML页面中嵌入Java代码...
**JSP完整学习笔记概述** 本笔记是作者在专业培训学校学习JSP的总结,旨在为读者提供一个全面了解和掌握JavaServer Pages (JSP) 技术的资源。JSP是Java平台上的动态网页技术,它允许开发人员将静态HTML内容与动态...
在这个"Servlet & JSP学习笔记NetBeans源代码"压缩包中,你将找到一系列与Servlet和JSP相关的示例代码,这些代码是基于NetBeans IDE编写的,并且是在Tomcat服务器上运行的。 Tomcat是一个开源的轻量级Web服务器和...
本篇学习笔记将深入探讨JSP自定义标签的相关概念、创建方法以及实际应用。 一、概述 1.1 使用简单标签机制 JSP自定义标签提供了类似HTML标签的语法结构,通过自定义标签,开发者可以封装复杂的Java代码,使得页面...
【韩顺平jsp九讲笔记】是一份详细记录了韩顺平老师关于JSP(Java Server Pages)技术的九次讲解的学习资料。这份笔记涵盖了JSP的基础知识、核心概念以及实际应用,旨在帮助学习者深入理解和掌握JSP编程。韩顺平老师...
**JSP完全学习笔记概述** JSP(JavaServer Pages)是一种动态网页技术,它结合了HTML、Java代码和脚本语言,使得开发者可以方便地创建交互式的Web应用程序。本学习笔记全面涵盖了JSP的关键概念、核心语法、常用标签...