本篇讨论的问题是对项目中遇到的难题进行技术穿刺。
做过项目的人都知道,在构思完一个项目的功能之后,紧接着的事情就是考虑这些构思 的功能如何实现,对于自己不熟悉的领域,要进行技术穿刺。我的穿刺方法为先查找有无比 较好的开源组件可用,如果没有,就查找相关的文档,自己编写和测试代码。
在这一篇,我主要解决三个问题。
1、解决字符串加密的问题,在前面一篇中,我们设计用户模块的时候,准备将用户的密 码字段以MD5加密的方式保存,因此,这里需要写一个对字符串加密生成MD5字符串的方法;
2、解决生成图像缩略图和生成验证码的问题;
3、解决url重写的问题,之所以要用到url重写,主要是为了让用户在访问自己的主页时 ,可以使用http://www.xkland.com/username或者http://username.xkland.com这样的形式 ,而不是像http://www.xkland.com/index.jsp?username=xxx这样难看的形式。
需要说明的是,要解决上面的三个问题,不是没有开源的东西可用,而是我觉得每次都 要整合不同的组件是在是太麻烦,而我们需要的功能也不是很复杂,我们不需要太通用的东 西,只要能够解决这里特定的问题就行了,因此不如自己动手实现,同时还可以获得技术上 的提高。
首先来看看MD5加密的问题,JDK中本来提供有数据加密的支持,其中 java.security.MessageDigest类就可以实现MD5的加密,但是,加密后生成的数据是byte[] 类型的,这里只需要写一个方法将它转换为字符串就行,代码如下:
package com.xkland.util;
import java.security.MessageDigest;
import java.lang.NullPointerException;
import java.security.NoSuchAlgorithmException;
public class StringUtil {
public static char [] num_chars = new char [] { ' 0 ' ,
' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' ,
' 9 ' , ' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' } ;
public static String toMD5String(String input)
throws NullPointerException,NoSuchAlgorithmException {
if (input == null ) throw new NullPointerException();
char [] output = new char [ 32 ];
MessageDigest md = MessageDigest.getInstance( " MD5 " );
byte [] by = md.digest(input.getBytes());
for ( int i = 0 ;i < by.length;i ++ ) {
output[ 2 * i] = num_chars[ (by[i] & 0xf0 ) >> 4 ];
output[ 2 * i + 1 ] = num_chars[ by[i] & 0xf ];
}
return new String(output);
}
}