zoukankan      html  css  js  c++  java
  • MD5加密验证与URL路径拦截

    Q1:MD5加密

    MD5Util封装工具类(加密,包括包括字符串、文件、字节数组、等)

    package com.zhangyuwei.teacher.common;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    /**
     * MD5加密处理工具类
     * @author Administrator
     *
     */
    public class MD5Utils {
        /**
         * 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合
         */
        protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6',
                '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    
        protected static MessageDigest messagedigest = null;
        static {
            try {
                messagedigest = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException nsaex) {
                System.err.println(MD5Utils.class.getName()
                        + "初始化失败,MessageDigest不支持MD5Util。");
                nsaex.printStackTrace();
            }
        }
    
        /**
         * 生成字符串的md5校验值
         *
         * @param s
         * @return
         */
        public static String getMD5String(String s) {
            return getMD5String(s.getBytes());
        }
    
        /**
         * 判断字符串的md5校验码是否与一个已知的md5码相匹配
         *
         * @param password
         * 要校验的字符串
         * @param md5PwdStr
         * 已知的md5校验码
         * @return
         */
        public static boolean isEqualsToMd5(String password, String md5PwdStr) {
            String s = getMD5String(password);
            return s.equals(md5PwdStr);
        }
    
        /**
         * 生成文件的md5校验值
         *
         * @param file
         * @return
         * @throws IOException
         */
        public static String getFileMD5String(File file) throws IOException {
            InputStream fis;
            fis = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            int numRead = 0;
            while ((numRead = fis.read(buffer)) > 0) {
                messagedigest.update(buffer, 0, numRead);
            }
            fis.close();
            return bufferToHex(messagedigest.digest());
        }
    
        /**
         * 生成字节数组的md5校验值
         *
         * @param s
         * @return
         */
        public static String getMD5String(byte[] bytes) {
            messagedigest.update(bytes);
            return bufferToHex(messagedigest.digest());
        }
    
        private static String bufferToHex(byte bytes[]) {
            return bufferToHex(bytes, 0, bytes.length);
        }
    
        private static String bufferToHex(byte bytes[], int m, int n) {
            StringBuffer stringbuffer = new StringBuffer(2 * n);
            int k = m + n;
            for (int l = m; l < k; l++) {
                appendHexPair(bytes[l], stringbuffer);
            }
            return stringbuffer.toString();
        }
    
        private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
            char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>>
    // 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同
            char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
            stringbuffer.append(c0);
            stringbuffer.append(c1);
        }
    
        /**
         * 将源字符串使用MD5加密为字节数组
         * @param source
         * @return
         */
        public static byte[] encode2bytes(String source) {
            byte[] result = null;
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.reset();
                md.update(source.getBytes("UTF-8"));
                result = md.digest();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            return result;
        }
    
        /**
         * 将源字符串使用MD5加密为32位16进制数
         * @param source
         * @return
         */
        public static String encode2hex(String source) {
            byte[] data = encode2bytes(source);
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < data.length; i++) {
                String hex = Integer.toHexString(0xff & data[i]);
    
                if (hex.length() == 1) {
                    hexString.append('0');
                }
    
                hexString.append(hex);
            }
    
            return hexString.toString();
        }
    
        /**
         * 验证字符串是否匹配
         * @param unknown 待验证的字符串
         * @param okHex 使用MD5加密过的16进制字符串
         * @return 匹配返回true,不匹配返回false
         */
        public static boolean validate(String unknown , String okHex) {
            return okHex.equals(encode2hex(unknown));
        }
    }

    测试:

    package com.zhangyuwei.teacher.common;
    
    public class MD5UtilTest {
        /**
         * MD5加密
         * MD5验证
         * */
        public static void main(String[] args) {
            String password=MD5Utils.getMD5String("736375819");
            System.out.println(password);
            if(MD5Utils.isEqualsToMd5("736375819",password)){
                System.out.println("匹配成功!");
            }else{
                System.out.println("匹配失败!");
            }
        }
    }

     Q2:URL路径拦截

    大家想要理解拦截器是指定所要拦截的,除了一些我不需要拦截的,一下/login,/regist是我需要排出拦截的

    spring-mvc

    <!--拦截器-->
        <!--配置拦截器 拦截除了exceptUrls内的所有请求-->
       <mvc:interceptors>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="com.zhangyuwei.teacher.controller.LoginInterceptor">
                    <property name="exceptUrls">
                        <list>
                            <value>/login</value>
                            <value>/register</value>
                            <value>/TeacherServlet/login</value>
                        </list>
                    </property>
                </bean>
            </mvc:interceptor>
        </mvc:interceptors>

    LoginInterceptor

    package com.zhangyuwei.teacher.controller;
    
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.List;
    
    public class LoginInterceptor extends HandlerInterceptorAdapter {
        private List<String> exceptUrls;
    
        public List<String> getExceptUrls() {
            return exceptUrls;
        }
    
        public void setExceptUrls(List<String> exceptUrls) {
            this.exceptUrls = exceptUrls;
        }
        //执行action之前来执行
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String requestUri=request.getRequestURI();
            if(requestUri.startsWith(request.getContextPath())){
                requestUri = requestUri.substring(request.getContextPath().length(), requestUri.length());
            }
            //系统根目录
            if (StringUtils.equals("/",requestUri)) {
                return true;
            }
            //放行exceptUrls中配置的url
            for (String url:exceptUrls
                    ) {
                if(url.endsWith("/**")){
                    if (requestUri.startsWith(url.substring(0, url.length() - 3))) {
                        return true;
                    }
                } else if (requestUri.startsWith(url)) {
                    return true;
                }
            }
            //其他需要登录后才能进行访问的url
            //String sessionid = request.getSession().getId();
            //在这里我们可以定义一个session来存储登录状态
            String status=null;
            //如果没有登录
            if(status==null){
                //返回到登录页面
                response.sendRedirect("login.html");
                return false;
            }else{
                return true;
            }
        }
    }

    结果就是当你直接访问login.html是可以进去的,二当你访问其它页面是,它会直接跳到login.html界面。

    zywds
  • 相关阅读:
    Golang的安装包方法
    Debian kvm网络配置
    Debian-Linux配置网卡网络方法
    KVM虚拟机网络配置 Bridge方式,NAT方式
    WebRTC之框架与接口
    WebRTC
    关于golang.org/x包问题
    http内网转发
    linux服务器可以访问IP访问不了域名地址
    golang--生成某区间的随机数
  • 原文地址:https://www.cnblogs.com/zywds/p/9931276.html
Copyright © 2011-2022 走看看