自动登录问题和MD5加密
前面已经完成了Filter的自动登录,但是有问题,我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截。这肯定不合适。我们本来访问/login.jsp,本来就是去登录,结果也进行了拦截。
解决自动登录问题
其实,我们可以在AutoLoginFilter.java这个文件中写if语句来判断,虽然web.xml文件还是配置拦截/*, 但是只有在if满足条件,才进行拦截,否则,直接放行就好。
下面if条件,我们不希望/login.jsp 和/loginServlet这两个请求地址被拦截,所以这里取反,使用!符号。意思就是除了这两个之外地址都拦截。
packagecom.kaigejava.web.filter;
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.Cookie;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importcom.anthony.domain.User;
importcom.anthony.service.UserService;
importcom.anthony.service.UserServiceImpl;
publicclassAutoLoginFilterimplementsFilter {
publicvoiddestroy() {
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)
throwsIOException, ServletException {
// 1转换两个对象HttpServletRequest HttpServletResponse
HttpServletRequestreq= (HttpServletRequest)request;
HttpServletResponseresp= (HttpServletResponse)response;
//优化
Stringuri=req.getRequestURI();//浏览器中url端口8080后面部分
Stringpath=req.getContextPath();//应用名称
path=uri.substring(path.length());// /login.jsp
if(!("/login.jsp".equals(path)) || ("/loginServlet".equals(path))) {
// 2.处理业务,这里是得到cookies
//优化
Useruser= (User)req.getSession().getAttribute("user");
if(user==null) {//说明从来没有登录过
Cookie[]cookies=req.getCookies();
Stringusername="";
Stringpassword="";
for(inti= 0;cookies!=null&&icookies.length;i++) {
if("user".equals(cookies[i].getName())) {
Stringvalue=cookies[i].getValue();//username&password这样一个格式字符串
//得到用户名和密码
String[]values=value.split("&");
username=values[0];
password=values[1];
}
}
UserServiceus=newUserServiceImpl();
Useru=us.findUser(username,password);
if(u!=null) {//如果登录成功,把用户信息存到session中
req.getSession().setAttribute("user",u);
}
}
}
// 3.放行
chain.doFilter(request,response);
}
publicvoidinit(FilterConfigfConfig)throwsServletException {
}
}
可以再次测试下,例如在LoginServlet中或者打印用户名和密码字段,可以发现只执行了一次登录,也就是没有被拦截。
MD5加密
第一个要知道的是MD5(Message-Digest Algoorithm 5)是一种不可逆的加密算法。也就是只能加密,不能解密操作。那么我们登录是如何做到呢,一般来说数据库中用户名密码肯定采用MD5加密。在后台拿到前端获取密码,然后把这个密码通过MD5加密,然后传入数据库和密码这栏比较,相等就说明密码一样。
先来看看MD5加密效果
上面这个图是用户密码在数据库中是没有加密过的,下面我们执行把第二个用户进行md5加密之后,看看加密之后密码处的效果。
UPDATE users SET PASSWORD=MD5(PASSWORD) WHERE id=2;
这个一长串密码就是MD5加密之后的效果。
Java中如何使用MD5加密
这个MD5加密方法算一个工具类吧,网上很容易搜到,下面是代码方法
packagecom.kaigejava.util;
importjava.math.BigInteger;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
publicclassMD5Utils {
publicstaticString md5(StringplainText) {
byte[]secreBytes=null;
try{
secreBytes= MessageDigest.getInstance("md5").digest(plainText.getBytes());
}catch(NoSuchAlgorithmExceptione) {
thrownewRuntimeException("没有md5这个算法!");
}
Stringmd5code=newBigInteger(1,secreBytes).toString(16);
for(inti= 0;imd5code.length();i++) {
md5code="0"+md5code;
}
returnmd5code;
}
}
登录过程使用加密密码
在LoginServlet.java中处理登录,这个我们通过request.getParameter(“password”)得到的密码肯定是明文的,这时候我们需要先给password进行MD5加密,然后进行登录操作。(前提是用户注册过程中,后台代码在处理注册的servlet中就把用户密码给进行MD5加密,然后保存在数据中的密码就是加密的形式)
上面如果是在注册的servlet中也这样对password进行加密。