MD5暗号化および自動サインインの問題
すでにフィルター自動ログインを行ってますが、問題があるように、我々は、web.xmlのフィルターに設定されたルールを持っているURLマッピング/ *、インターセプトされているすべての要求のサイトがあります。これは確かに適切ではありません。私たちは、アクセス/login.jspを持っていた、常にログインするために行くことになっている、結果はまた、ブロックされています。
自動ログイン問題解決
実際には、我々は唯一、それ以外の場合は、のような直接のリリースを傍受するために、if文、* / web.xml構成ファイルや傍受が、しかし、唯一の条件かどうかを判断するためにAutoLoginFilter.javaにこのファイルを書き込むことができます。
以下の条件がある場合は、我々はこれら2つの要求が否定されるので、ここで、インターセプトされ/login.jspおよび/がloginservletアドレスを望んでいない、使用します!シンボル。これら二つのアドレスに加えて、傍受外であることを意味しています。
パッケージ Comkkagejvkvebkfailtr;
インポート にjava.io.IOException;
インポート は、javax.servlet.Filter;
輸入 れるjavax.servlet.FilterChain。
インポート するjavax.servlet.FilterConfig。
輸入 javax.servlet.ServletException;
輸入 javax.servlet.ServletRequest;
インポートのjavax.servlet.ServletResponse 。
インポート のjavax.servlet.http.Cookie。
インポート のjavax.servlet.http.HttpServletRequest;
インポート のjavax.servlet.http.HttpServletResponse;
輸入 com.anthony.domain.User。
輸入 com.anthony.service.UserService。
輸入 com.anthony.service.UserServiceImpl。
パブリッククラス AutoLoginFilterは 実装 フィルターを{
公共の無効 (破棄){
}
公共ボイド のdoFilter(ServletRequestの 要求、 たServletResponse 応答、フィルターチェーン チェーン)
スロー にIOException、ServletExceptionがは{
1 // 2つのオブジェクトを変換する のHttpServletRequest HttpServletResponseの
HttpServletRequestの REQ =(HttpServletRequestの) 要求。
HttpServletResponseの RESP =(HttpServletResponseの) 応答。
// 最適化
文字列の URI = REQ .getRequestURI(); // ブラウザのURLのポート8080 以降の
文字列 パス = REQ .getContextPath(); // アプリケーション名
パス = URI .substring(パス.LENGTH())。 // /login.jsp
もし (!("/login.jsp" .equals(パス))||("/がloginservlet" .equals(パス))){
// 2. 加工事業、 ここで取得することであるクッキーを
// 最適化
ユーザの ユーザ =(ユーザー) REQ .getSession()のgetAttribute("ユーザ" )。
IF (ユーザー == nullの){ // 命令が記録されたことがありません
クッキー[] クッキー = REQの.getCookies()。
文字列 名 = 「」;
文字列の パスワード = 「」;
以下のために (int型I ; = 0 クッキー != nullのを && 私は < クッキーを。長さを、 私は++){
もし ("ユーザ" .equals(クッキー[ I ] .getName())){
文字列 値 = クッキー[ I ]以降.getvalue(); // ユーザ名とパスワードなどのフォーマット文字列
// ユーザ名とパスワードを取得
文字列[] の値 = 値.split("&" )。
ユーザ名 = 値[0]。
password = values[1];
}
}
UserService us = new UserServiceImpl();
User u = us.findUser(username, password);
if (u != null) { // 如果登录成功,把用户信息存到session中
req.getSession().setAttribute("user", u);
}
}
}
// 3.放行
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
可以再次测试下,例如在LoginServlet中或者打印用户名和密码字段,可以发现只执行了一次登录,也就是没有被拦截。
MD5加密
第一个要知道的是MD5(Message-Digest Algoorithm 5)是一种不可逆的加密算法。也就是只能加密,不能解密操作。那么我们登录是如何做到呢,一般来说数据库中用户名密码肯定采用MD5加密。在后台拿到前端获取密码,然后把这个密码通过MD5加密,然后传入数据库和密码这栏比较,相等就说明密码一样。
先来看看MD5加密效果
上面这个图是用户密码在数据库中是没有加密过的,下面我们执行把第二个用户进行md5加密之后,看看加密之后密码处的效果。
UPDATE users SET PASSWORD=MD5(PASSWORD) WHERE id=2;
这个一长串密码就是MD5加密之后的效果。
Java中如何使用MD5加密
这个MD5加密方法算一个工具类吧,网上很容易搜到,下面是代码方法
package com.kaigejava.util;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
public static String md5(String plainText) {
byte[] secreBytes = null;
try {
secreBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());
}catch (NoSuchAlgorithmException e) {
throw new RuntimeException("没有md5这个算法!");
}
String md5code = new BigInteger(1, secreBytes).toString(16);
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
}
登录过程使用加密密码
在LoginServlet.java中处理登录,这个我们通过request.getParameter(“password”)得到的密码肯定是明文的,这时候我们需要先给password进行MD5加密,然后进行登录操作。(前提是用户注册过程中,后台代码在处理注册的servlet中就把用户密码给进行MD5加密,然后保存在数据中的密码就是加密的形式)
上面如果是在注册的servlet中也这样对password进行加密。