文档章节

在JSP中实现HTTP认证安全

tojsp_com
 tojsp_com
发布于 2010/08/25 12:54
字数 1108
阅读 592
收藏 4

前言

 

        HTTP认证是Web服务器对客户端的权限进行认证的一种方式,能够为Web应用(如jsp)提供一定程度的安全保障。目前一些Web应用项目(如jsp)已经提出了采用HTTP认证的需求。虽然一般的Web容器都提供基本认证和摘要认证的API,但不同的Web容器提供的API也互不相同,因此我们在ZX Web平台的工具包中提供了一组API,利用这组API,开发人员可以在应用程序中使用统一的接口轻松实现HTTP认证功能,而不必依赖于Web容器。

        最近研究了jsp中作HTTP认证的问题,它的工作方式如下:

        1、server发送一个要求认证代码401和一个头信息WWW-authenticate,激发browser弹出一个认证窗口

        2、server取得browser送来的认证头"Authorization",它是加密的了,要用Base64方法解密,取得明文的用户名和密码

        3、检查用户名和密码,根据结果传送不同的页面


        以下是jsp的片断,你也可以把它做成include文件。和Base64的加解密的class源码。如有兴趣可与他联系:unixboy@yeah.net

XML/HTML代码
  1. <jsp:useBean id="base64" scope="page" class="Base64"/>  
  2. <%   
  3. if(request.getHeader("Authorization")==null){   
  4. response.setStatus(401);   
  5. response.setHeader("WWW-authenticate", "Basic realm="unixboy.com"");   
  6. }else{   
  7. String encoded=(request.getHeader("Authorization"));   
  8. String tmp=encoded.substring(6);   
  9. String up=Base64.decode(tmp);   
  10. String user="";   
  11. String password="";   
  12. if(up!=null){   
  13. user=up.substring(0,up.indexOf(":"));   
  14. password=up.substring(up.indexOf(":")+1);   
  15. }   
  16. if(user.equals("unixboy")&&password.equals("123456")){   
  17. //认证成功   
  18. }else{   
  19. //认证失败   
  20. }   
  21. }   
  22. %>  
  23.   
  24.   
  25. //消息加解密class   
  26. public class Base64   
  27. {   
  28. /** decode a Base 64 encoded String.   
  29. <p><h4>String to byte conversion</h4>  
  30. * This method uses a naive String to byte interpretation, it simply gets each   
  31. * char of the String and calls it a byte.</p>  
  32. <p>Since we should be dealing with Base64 encoded Strings that is a reasonable   
  33. * assumption.</p>  
  34. <p><h4>End of data</h4>  
  35. * We don´t try to stop the converion when we find the "=" end of data padding char.   
  36. * We simply add zero bytes to the unencode buffer.</p>  
  37. */   
  38. public static String decode(String encoded)   
  39. {   
  40. StringBuffer sb=new StringBuffer();   
  41. int maxturns;   
  42. //work out how long to loop for.   
  43. if(encoded.length()%3==0)   
  44. maxturns=encoded.length();   
  45. else   
  46. maxturns=encoded.length()+(3-(encoded.length()%3));   
  47. //tells us whether to include the char in the unencode   
  48. boolean skip;   
  49. //the unencode buffer   
  50. byte[] unenc=new byte[4];   
  51. byte b;   
  52. for(int i=0,j=0; i<maxturns; i++)   
  53. {   
  54. skip=false;   
  55. //get the byte to convert or 0   
  56. if(i<encoded.length())   
  57. b=(byte)encoded.charAt(i);   
  58. else   
  59. b=0;   
  60. //test and convert first capital letters, lowercase, digits then ´+´ and ´/´   
  61. if(b>=65 && b<91)   
  62. unenc[j]=(byte)(b-65);   
  63. else if(b>=97 && b<123)   
  64. unenc[j]=(byte)(b-71);   
  65. else if(b>=48 && b<58)   
  66. unenc[j]=(byte)(b+4);   
  67. else if(b==´+´)   
  68. unenc[j]=62;   
  69. else if(b==´/´)   
  70. unenc[j]=63;   
  71. //if we find "=" then data has finished, we´re not really dealing with this now   
  72. else if(b==´=´)   
  73. unenc[j]=0;   
  74. else   
  75. {   
  76. char c=(char)b;   
  77. if(c==´ ´ || c==´ ´ || c==´ ´ || c==´ ´)   
  78. skip=true;   
  79. else   
  80. //could throw an exception here? it´s input we don´t understand.   
  81. ;   
  82. }   
  83. //once the array has boiled convert the bytes back into chars   
  84. if(!skip && ++j==4)   
  85. {   
  86. //shift the 6 bit bytes into a single 4 octet word   
  87. int res=(unenc[0] << 18)+(unenc[1] << 12)+(unenc[2] << 6)+unenc[3];   
  88. byte c;   
  89. int k=16;   
  90. //shift each octet down to read it as char and add to StringBuffer   
  91. while(k>=0)   
  92. {   
  93. c=(byte)(res >> k);   
  94. if ( c > 0 )   
  95. sb.append((char)c);   
  96. k-=8;   
  97. }   
  98. //reset j and the unencode buffer   
  99. j=0;   
  100. unenc[0]=0;unenc[1]=0;unenc[2]=0;unenc[3]=0;   
  101. }   
  102. }   
  103. return sb.toString();   
  104. }   
  105.   
  106. /** encode plaintext data to a base 64 string   
  107. * @param plain the text to convert. If plain is longer than 76 characters this method   
  108. * returns null (see RFC2045).   
  109. * @return the encoded text (or null if string was longer than 76 chars).   
  110. */   
  111. public static String encode(String plain)   
  112. {   
  113. if(plain.length()>76)   
  114. return null;   
  115. int maxturns;   
  116. StringBuffer sb=new StringBuffer();   
  117. //the encode buffer   
  118. byte[] enc=new byte[3];   
  119. boolean end=false;   
  120. for(int i=0,j=0; !end; i++)   
  121. {   
  122. char _ch=plain.charAt(i);   
  123. if(i==plain.length()-1)   
  124. end=true;   
  125. enc[j++]=(byte)plain.charAt(i);   
  126. if(j==3 || end)   
  127. {   
  128. int res;   
  129. //this is a bit inefficient at the end point   
  130. //worth it for the small decrease in code size?   
  131. res=(enc[0] << 16)+(enc[1] << 8)+enc[2];   
  132. int b;   
  133. int lowestbit=18-(j*6);   
  134. for(int toshift=18; toshift>=lowestbit; toshift-=6)   
  135. {   
  136. b=res >>> toshift;   
  137. b&=63;   
  138. if(b>=0 && b<26)   
  139. sb.append((char)(b+65));   
  140. if(b>=26 && b<52)   
  141. sb.append((char)(b+71));   
  142. if(b>=52 && b<62)   
  143. sb.append((char)(b-4));   
  144. if(b==62)   
  145. sb.append(´+´);   
  146. if(b==63)   
  147. sb.append(´/´);   
  148. if(sb.length()%76==0)   
  149. sb.append(´ ´);   
  150. }   
  151. //now set the end chars to be pad character if there    
  152. //was less than integral input (ie: less than 24 bits)   
  153. if(end)   
  154. {   
  155. if(j==1)   
  156. sb.append("==");   
  157. if(j==2)   
  158. sb.append(´=´);   
  159. }   
  160. enc[0]=0; enc[1]=0; enc[2]=0;   
  161. j=0;   
  162. }   
  163. }   
  164. return sb.toString();   
  165. }   
  166. }   

        本文转自网络,程序如有错误请与原作者联系,本程序leo未加验证。leo整理了一些资料,希望能对研究下方面知识的朋友有用处

 

相关文章:

© 著作权归作者所有

tojsp_com
粉丝 8
博文 14
码字总数 10888
作品 0
深圳
私信 提问
Servlet的Web Fragments和安全性

Web Fragments碎片   一个web片段是web.xml文件的部分或全部,被包含的库或框架的JAR的 META-INF目录。如果这个框架捆绑在当前项目的WEB-INF/lib目录中, 容器将发现找到并配置框架,而无需...

D_I
2015/03/03
654
0
Servlet基础

Servlet简介:Servlet是sun公司提供的一门用于开发动态web资源的技术,sun公司在API中提供了一个Servlet接口,用户若想完成一个动态web资源,需要完成以下两个步骤: ----1、编写一个Java类,...

晨曦之光
2012/05/16
375
0
Java EE8的五大最新特性

本文由ImportNew -enigma 翻译自dzone。欢迎加入翻译小组。转载请见文末要求。 备受期待的 Java Enterprise Edition 8 发布了两个令人兴奋的全新 API (JSON-Binding 1.0 和 Java EE Securi...

ImportNew
2018/07/25
0
0
Servlet生命周期与工作原理

Servlet生命周期分为三个阶段:   1,初始化阶段 调用init()方法   2,响应客户请求阶段  调用service()方法   3,终止阶段  调用destroy()方法 Servlet初始化阶段:   在下列时...

№贪↗恋♂
2012/08/08
159
0
Java Web-Servlet

章节目录 什么是Servlet Servlet 、ServletContext、Servlet Container、web 容器之间的区别 Servlet、ServletConfig、GenericServlet、HttpServlet、自定义Servlet 之间的联系 HttpServlet ......

markfork
2018/06/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

新架构、新角色:TiDB Community Upgrade!

作者:Jian Zhang 经过几年的发展,TiDB 社区已经逐渐成熟,但是随着社区的发展壮大,我们逐渐感受到了现在社区架构上的一些不足。经过一系列的思考和总结,我们决定升级和调整目前社区组织架...

TiDB
29分钟前
5
0
jquery qrcode库提示not function

jquery qrcode 这个库能用,但是必须在初始化的时候,官方给的使用方法是 引入qrcode的库文件后,在js中写以下 html <div id="qrcode"></div> js jQuery('#qrcode').qrcode({ render: ......

shikamaru
34分钟前
13
0
MySQL数据库去重的简单方案

利用 distinct 对需要处理的字段进行去重 select distinct 字段名 from 表名 利用group by select * from 表名 group by 字段名 利用having select * from 表名 group by 字段名 having 字段...

FeanLau
36分钟前
9
0
字符串转换成整数

实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时,则将该...

蔚蓝_晴天
47分钟前
8
0
Eureka客户端续约及服务端过期租约清理源码解析

在之前的文章:EurekaClient自动装配及启动流程解析中,我们提到了在构造DiscoveryClient时除了包含注册流程之外,还调度了一个心跳线程: scheduler.schedule( new Ti...

Java学习录
59分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部