最近研究了jsp中作HTTP认证的问题,它的工作方式如下:
1、server发送一个要求认证代码401和一个头信息WWW-authenticate,激发browser弹出一个认证窗口
2、server取得browser送来的认证头"Authorization",它是加密的了,要用Base64方法解密,取得明文的用户名和密码
3、检查用户名和密码,根据结果传送不同的页面
以下是jsp的片断,你也可以把它做成include文件。和Base64的加解密的class源码。
如有兴趣可与我联系:unixboy@yeah.net
<jsp:useBean id="base64"scope="page"class="Base64"/>
<%
if(request.getHeader("Authorization")==null){
response.setStatus(401);
response.setHeader("WWW-authenticate","Basic realm=\"unixboy.com\"");
}else{
String encoded=(request.getHeader("Authorization"));
String tmp=encoded.substring(6);
String up=Base64.decode(tmp);
String user="";
String password="";
if(up!=null){
user=up.substring(0,up.indexOf(":"));
password=up.substring(up.indexOf(":") 1);
}
if(user.equals("unixboy")&&password.equals("123456")){
//认证成功
}else{
//认证失败
}
}
%>
//消息加解密class
public class Base64
{
/** decode a Base 64 encoded String.
*<p><h4>String to byte conversion</h4>
* This method uses a naive String to byte interpretation, it simply gets each
* char of the String and calls it a byte.</p>
*<p>Since we should be dealing with Base64 encoded Strings that is a reasonable
* assumption.</p>
*<p><h4>End of data</h4>
* We don''t try to stop the converion when we find the"="end of data padding char.
* We simply add zero bytes to the unencode buffer.</p>
*/
public static String decode(String encoded)
{
StringBuffer sb=new StringBuffer();
int maxturns;
//work out how long to loop for.
if(encoded.length()%3==0)
maxturns=encoded.length();
else
maxturns=encoded.length() (3-(encoded.length()%3));
//tells us whether to include the char in the unencode
boolean skip;
//the unencode buffer
byte[] unenc=new byte[4];
byte b;
for(int i=0,j=0;i<maxturns;i )
{
skip=false;
//get the byte to convert or 0
if(i<encoded.length())
b=(byte)encoded.charAt(i);
else
b=0;
//test and convert first capital letters, lowercase, digits then '' '' and ''/''
if(b>=65&&b<91)
unenc[j]=(byte)(b-65);
else if(b>=97&&b<123)
unenc[j]=(byte)(b-71);
else if(b>=48&&b<58)
unenc[j]=(byte)(b 4);
else if(b=='' '')
unenc[j]=62;
else if(b==''/'')
unenc[j]=63;
//if we find"="then data has finished, we''re not really dealing with this now
else if(b==''='')
unenc[j]=0;
else
{
char c=(char)b;
if(c==''\n'' || c==''\r'' || c=='' '' || c==''\t'')
skip=true;
else
//could throw an exception here? it''s input we don''t understand.
;
}
//once the array has boiled convert the bytes back into chars
if(!skip&& j==4)
{
//shift the 6 bit bytes into a single 4 octet word
int res=(unenc[0]<<18) (unenc[1]<<12) (unenc[2]<<6) unenc[3];
byte c;
int k=16;
//shift each octet down to read it as char and add to StringBuffer
while(k>=0)
{
c=(byte)(res>>k);
if ( c>0 )
sb.append((char)c);
k-=8;
}
//reset j and the unencode buffer
j=0;
unenc[0]=0;unenc[1]=0;unenc[2]=0;unenc[3]=0;
}
}
return sb.toString();
}
/** encode plaintext data to a base 64 string
* @param plain the text to convert. If plain is longer than 76 characters this method
* returns null (see RFC2045).
* @return the encoded text (or null if string was longer than 76 chars).
*/
public static String encode(String plain)
{
if(plain.length()>76)
return null;
int maxturns;
StringBuffer sb=new StringBuffer();
//the encode buffer
byte[] enc=new byte[3];
boolean end=false;
for(int i=0,j=0;!end;i )
{
char _ch=plain.charAt(i);
if(i==plain.length()-1)
end=true;
enc[j ]=(byte)plain.charAt(i);
if(j==3 || end)
{
int res;
//this is a bit inefficient at the end point
//worth it for the small decrease in code size?
res=(enc[0]<<16) (enc[1]<<8) enc[2];
int b;
int lowestbit=18-(j*6);
for(int toshift=18;toshift>=lowestbit;toshift-=6)
{
b=res>>>toshift;
b&=63;
if(b>=0&&b<26)
sb.append((char)(b 65));
if(b>=26&&b<52)
sb.append((char)(b 71));
if(b>=52&&b<62)
sb.append((char)(b-4));
if(b==62)
sb.append('' '');
if(b==63)
sb.append(''/'');
if(sb.length()v==0)
sb.append(''\n'');
}
//now set the end chars to be pad character if there
//was less than integral input (ie: less than 24 bits)
if(end)
{
if(j==1)
sb.append("==");
if(j==2)
sb.append(''='');
}
enc[0]=0;enc[1]=0;enc[2]=0;
j=0;
}
}
return sb.toString();
}
}
分享到:
相关推荐
在JSP中,可以通过Session或Cookie来跟踪用户的登录状态,确保只有经过认证的管理员才能访问后台管理页面。同时,描述中的“呵呵,下载吧,只有下载了才知道怎么样实现的”提示了这个系统可能包含了一些具体的实现...
在jsp登录页面设计中,我们使用认证机制来验证用户的身份。例如,在上面的代码中,我们使用if语句来验证用户输入的用户名和密码,如果验证成功,则设置login的值为ok,并跳转到main.jsp页面,否则,打印错误信息。 ...
理解如何在JSP页面中嵌入Java代码,以及如何通过内置对象(如request、response、session和application)处理HTTP请求和响应。 2. Servlet技术:虽然JSP主要用于视图层,但通常会与Servlet结合使用来处理业务逻辑。...
jsp 中 session 的使用方法可以帮助开发者追踪用户的操作过程,而不需要担心追踪的实现细节。Session 是一种服务器端的机制,用于存储用户的信息,以便在多个页面之间共享数据。 在 jsp 中, session 是通过 ...
- 商品名称存储在数组`s`中,如`"mp3播放器"`、`"笔记本电脑"`等。 - 价格存储在数组`prices`中,如`"1500"`、`"15600"`等。 - 使用`setTable()`方法生成商品列表,并调用`NumberFormat.getCurrencyInstance()`对...
通过上述分析,我们可以清楚地了解到在JSP中如何利用`HttpServletRequest`对象来获取各种HTTP请求信息,这对于优化Web应用性能、提高用户体验以及加强安全性等方面都有着重要作用。开发者可以根据实际需求灵活运用...
这个项目展示了JSP在实际Web开发中的应用,特别是对于用户交互和数据处理方面的能力。 首先,让我们深入了解JSP(Java Server Pages)。JSP是一种动态网页技术,它是Java Servlet技术的简化版本,主要用于生成动态...
在JSP制作的论坛中,JSP页面通常用于展示用户界面,如登录、注册、发帖、回帖等界面,而背后的业务逻辑则由JavaBeans或Servlet来处理。JavaBeans是一种可重用的Java组件,常被用来封装业务逻辑,而Servlet是服务器端...
在实际应用中,Base64常用于对敏感数据进行简单的加密,例如在HTTP头中传输认证信息(如Basic Auth)。然而,需要注意的是,Base64并不是一种安全的加密算法,因为它只是一种编码方式,易于解码。对于需要保护的数据...
在JSP中实现这些功能时,可能需要使用`<jsp:useBean>`和`<jsp:setProperty>`标签来创建和操作JavaBean,这样可以在JSP页面上更方便地调用JavaMail API的方法。 这个压缩包中的"jsp发邮件"文件应该包含了上述各个...
【jsp机试题目、程序员的考试认证】这个主题主要涵盖了JavaServer Pages(JSP)技术在实际项目中的应用,以及与之相关的编程考试内容。JSP是Java平台上的一个重要组成部分,用于开发动态web应用程序。以下是对这些...
在"ex6.6_application"实例中,我们可能会遇到数据库连接、用户认证、会话管理等常见应用场景。通过这个实例,学习者可以学习如何使用JDBC进行数据库操作,如何使用session来跟踪用户状态,以及如何处理表单提交和...
2. **JDBC连接**:在JSP页面中,使用`Class.forName()`加载JDBC驱动,然后通过`DriverManager.getConnection()`建立与MySQL服务器的连接。 3. **SQL操作**:使用PreparedStatement或Statement对象执行SQL语句,如`...
在Java Server Pages (JSP) 开发过程中,开发者经常会遇到各种各样的异常情况。正确理解和处理这些异常对于确保应用程序的稳定性和用户体验至关重要。本文将详细解析JSP开发中常见的异常及其解决方法。 #### 1. **...
JSP中的Java代码实际上是在Servlet的`service()`方法中执行。 7. **JSP博客系统架构** 一个典型的JSP博客系统可能包括以下组件: - 用户登录注册模块:处理用户认证,存储用户信息。 - 文章发布模块:允许用户...
在JSP校友录系统中,JSP页面主要负责接收用户请求,处理数据,以及生成响应。例如,登录功能可能由一个JSP页面实现,该页面接收用户的用户名和密码,验证这些信息,然后根据结果重定向到相应的页面。 JavaScript则...
在JSP中,认证过程通常涉及HTTP请求、Servlet和JDBC(Java Database Connectivity)来处理数据库交互。 "登录"是用户访问受保护资源的关键步骤。在本案例中,用户提交登录表单后,服务器端的JSP页面将接收到这些...
在BBS论坛的实现中,JSP通常与Servlet、JavaBeans(Javabean)和MVC(Model-View-Controller)设计模式一起使用。Servlet处理HTTP请求,JavaBeans作为业务逻辑层对象,而JSP则负责视图渲染。 总结来说,"用jsp做的...
在BBS中,这些操作主要用于用户认证、帖子创建和检索。 4. **Servlet与JSP的关系**:虽然JSP文件看起来像是HTML,但它们最终会被编译成Servlet。Servlet是Java的服务器端组件,负责处理请求和生成响应。在JSP中,...