Javawebフィルタケース演習 - MD5暗号化と自動サインインの問題

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(usernamepassword);


                if (u != null) { // 如果登录成功,把用户信息存到session

                    req.getSession().setAttribute("user"u);

                }

            }

        }

        // 3.放行

        chain.doFilter(requestresponse);

    }


    public void init(FilterConfig fConfigthrows ServletException {

    }


}


可以再次测试下,例如在LoginServlet中或者打印用户名和密码字段,可以发现只执行了一次登录,也就是没有被拦截。

MD5加密

第一个要知道的是MD5(Message-Digest Algoorithm 5)是一种不可逆的加密算法。也就是只能加密,不能解密操作。那么我们登录是如何做到呢,一般来说数据库中用户名密码肯定采用MD5加密。在后台拿到前端获取密码,然后把这个密码通过MD5加密,然后传入数据库和密码这栏比较,相等就说明密码一样。

先来看看MD5加密效果

image1.png

上面这个图是用户密码在数据库中是没有加密过的,下面我们执行把第二个用户进行md5加密之后,看看加密之后密码处的效果。

UPDATE users SET PASSWORD=MD5(PASSWORD) WHERE id=2;

image2.png

这个一长串密码就是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加密,然后保存在数据中的密码就是加密的形式)

image3.png

上面如果是在注册的servlet中也这样对password进行加密。



おすすめ

転載: blog.51cto.com/kaigejava/2430296