精华内容
下载资源
问答
  • 在我们平时开发java企业项目,尤其是web项目时,返回给前端数据中,许多敏感数据要进行脱敏处理,譬如手机号,银行卡号,身份证等,一般都会抽成一个util类来处理脱敏逻辑,之前看过一篇【递归对JSONObject每一个...

    最近在开始写【spring源码深度解析】系列文章,如果有对spring源码感兴趣的同学,欢迎点击左上角我的头像,查看相关文章,该系列文章均是结合我当时学习源码的经历编写完成,不是一上来就堆砌源码,而是从日常使用展开学习,力求让初学者弄懂spring相关模块的实现
    在我们平时开发java企业项目,尤其是web项目时,返回给前端的数据中,许多敏感数据要进行脱敏处理,譬如手机号,银行卡号,身份证等,一般都会抽成一个util类来处理脱敏逻辑,之前看过一篇【递归对JSONObject每一个值进行加密操作】的博客,稍稍拓展了下,用在了项目中,下面分享给大家

    package com.corleone.util;
    
    
    import com.alibaba.fastjson.JSON;
    import org.springframework.util.StringUtils;
    
    import java.lang.reflect.Field;
    import java.math.BigDecimal;
    import java.util.*;
    
    public class SensitiveDataSolveUtil {
    
        /**
         * 脱敏方法入口
         * @param data 要脱敏的数据,必须为list,map,实体类中的一种
         * @param sensitiveColumn 要加密的字段
         */
        public static Object encodeSensitiveData(Object data, String... sensitiveColumn){
            if (data==null || sensitiveColumn.length==0){
                return data;
            }
            //先转化为json对象
            JSON rawJson = (JSON) JSON.toJSON(data);
            List<String> sensitiveColumnList= Arrays.asList(sensitiveColumn);
            dealWithRecursion(sensitiveColumnList,null,rawJson);
            return JSON.parseObject(rawJson.toString(), data.getClass());
        }
    
        private static Object dealWithRecursion(List<String> sensitiveColumnList,String key,Object object)  {
            //为JsonObject
            if (object instanceof Map) {
                Map jsonObject = (Map) object;
                Set keySet = jsonObject.keySet();
                for (Object o : keySet) {
                    if (jsonObject.get(o) instanceof Map) {
                        Map ooo = (Map) jsonObject.get(o);
                        if (ooo==null) {
                            jsonObject.put(o, null);
                        } else {
                            dealWithRecursion(sensitiveColumnList,o.toString(),jsonObject.get(o));
                        }
                    } else if (jsonObject.get(o) instanceof List) {
                        dealWithRecursion(sensitiveColumnList,o.toString(),jsonObject.get(o));
                    } else {
                        jsonObject.put(o, encodeSensitiveDataMap(o.toString(),jsonObject.get(o),sensitiveColumnList));
                    }
                }
                return jsonObject;
            } else if (object instanceof List) {
                //为JsonArray
                List<Object> list = new ArrayList<>();
                List jsonArray = (List) object;
                for (Object o : jsonArray) {
                    list.add(dealWithRecursion(sensitiveColumnList,key,o));
                }
                return list;
            } else {
                return encodeSensitiveDataMap(key,object,sensitiveColumnList);
            }
        }
    
        //处理单个json的map
        private static Object encodeSensitiveDataMap(String key,Object value, List<String> sensitiveColumnList) {
            if (sensitiveColumnList.contains(key)){
                return encodeNumber(value);
            }
            return value;
        }
    
        //加密数据
        public static Object encodeNumber(Object data){
            if (data==null){
                return data;
            }
            String number=data.toString();
            if (StringUtils.isEmpty(number)){
                return data;
            }
            //这里加密方式比较简单粗暴,可以采用commonDisplay方法
            if (number.length()<7){
                return "****";
            }
            return number.substring(0,3)+"****"+number.substring(number.length()-4);
        }
    
        private static final int SIZE = 6;
        private static final String SYMBOL = "*";
        /**
         * 通用脱敏方法
         * @param value
         * @return
         */
        public static String commonDisplay(String value) {
            if (null == value || "".equals(value)) {
                return value;
            }
            int len = value.length();
            int pamaone = len / 2;
            int pamatwo = pamaone - 1;
            int pamathree = len % 2;
            StringBuilder stringBuilder = new StringBuilder();
            if (len <= 2) {
                if (pamathree == 1) {
                    return SYMBOL;
                }
                stringBuilder.append(SYMBOL);
                stringBuilder.append(value.charAt(len - 1));
            } else {
                if (pamatwo <= 0) {
                    stringBuilder.append(value.substring(0, 1));
                    stringBuilder.append(SYMBOL);
                    stringBuilder.append(value.substring(len - 1, len));
    
                } else if (pamatwo >= SIZE / 2 && SIZE + 1 != len) {
                    int pamafive = (len - SIZE) / 2;
                    stringBuilder.append(value.substring(0, pamafive));
                    for (int i = 0; i < SIZE; i++) {
                        stringBuilder.append(SYMBOL);
                    }
                    if ((pamathree == 0 && SIZE / 2 == 0) || (pamathree != 0 && SIZE % 2 != 0)) {
                        stringBuilder.append(value.substring(len - pamafive, len));
                    } else {
                        stringBuilder.append(value.substring(len - (pamafive + 1), len));
                    }
                } else {
                    int pamafour = len - 2;
                    stringBuilder.append(value.substring(0, 1));
                    for (int i = 0; i < pamafour; i++) {
                        stringBuilder.append(SYMBOL);
                    }
                    stringBuilder.append(value.substring(len - 1, len));
                }
            }
            return stringBuilder.toString();
        }
    
        /**
         * 把data里所有带*的成员变量全部设置为null,这样如果dao层用的是updateByPrimaryKeySelective的方法,为空的字段就不会保存到数据库
         * @param data
         */
        public static void decodeSensitiveData(Object data){
            try {
                for (Field declaredField : data.getClass().getDeclaredFields()) {
                    declaredField.setAccessible(true);
                    Object fieldData=declaredField.get(data);
                    if (fieldData instanceof String){
                        String fieldDataStr=fieldData.toString();
                        if (!StringUtils.isEmpty(fieldDataStr)&&fieldDataStr.contains("*")) {
                            declaredField.set(data,null);
                        }
                    }
                }
            }catch (IllegalAccessException e){
                e.printStackTrace();
            }
        }
    
        //下面为测试代码
        public static void main(String[] args) {
            Map<String,String> map=new HashMap<>();
            map.put("phone","12312345678");
            map.put("name","jack");
            //打印{phone=123****5678, name=jack}
            System.out.println(encodeSensitiveData(map,"phone"));
            List<Map<String,String>> list=new ArrayList<>();
            list.add(map);
            list.add(map);
            //打印[{"phone":"123****5678","name":"jack"}, {"phone":"123****5678","name":"jack"}]
            System.out.println(encodeSensitiveData(list,"phone"));
            User user=new User();
            user.setIdcard("78787878787878");
            user.setPhone("12312345678");
            //打印User{phone='123****5678', idcard='787****7878'}
            System.out.println(encodeSensitiveData(user,"phone","idcard"));
        }
    
        static class User{
            private String phone;
            private String idcard;
    
            public String getPhone() {
                return phone;
            }
    
            public void setPhone(String phone) {
                this.phone = phone;
            }
    
            public String getIdcard() {
                return idcard;
            }
    
            public void setIdcard(String idcard) {
                this.idcard = idcard;
            }
    
            @Override
            public String toString() {
                return "User{" +
                        "phone='" + phone + '\'' +
                        ", idcard='" + idcard + '\'' +
                        '}';
            }
        }
    }
    
    
    展开全文
  • Java网上商城项目源码

    2016-07-12 15:48:10
    开发工具:MyEclipse 6.5 数据库: MySQL 服务器:TOMCAT 先导入数据库,然后部署到服务器,启动 在浏览器地址栏输入:http://localhost:8080/myshop/index.do即可进入 在主页上有一个logo 点击即可进入后台...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     用JAVA开发的一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录中文件大小及文件增减数目变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
  • Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录中文件大小及文件增减数目变化。...
  • java范例开发大全

    2013-03-08 20:06:54
    第1章 Java开发环境搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java...
  • java范例开发大全源代码

    热门讨论 2011-10-30 23:31:51
     第1章 Java开发环境搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7  实例1 ...
  • 先做个自我介绍 问题:(顺序记不清了) 你技术栈是什么 你觉得个人和团队做项目有什么不同 你过哪些工具来协调团队做项目 C++空类里默认有什么 java sleep 和wait区别 java多线程实现方式 ...

    先做个自我介绍
    问题:(顺序记不清了)
    你的技术栈是什么
    你觉得个人和团队做项目有什么不同
    你用过哪些工具来协调团队做项目
    C++空类里默认有什么
    java sleep 和wait的区别
    java多线程的实现方式

    一面通过后是网上笔试
    第一部分涉及你之前所选择的语言(我选的是C++)的题目,还有部分专业知识,比如偏移值、数据库、网络(研发和运维一起考,所以就算选了研发仍然有一部分是运维的题目)、WAS等
    结束第一部分后后面类似行测
    其中包括:
    部分A:给一段话选择正确/文中没提到/文章主旨等
    部分B:给数据(图标),根据题意计算/估计大概值,比如增长率、根据增长率估计某年销售额、A平均上比B多这类
    部分C:给三个图,选择符合规律的第四个图,规律往往包括旋转、AB两图相加减去重复部分等
    说到这些估计考公之类的心里就有数了。
    最后是100道的心里题,就和一般的评测差不多,就是给一句话(比如我是完美主义者这种)问你非常符合/比较符合/比较不符合/非常不符合

    二面-行政面
    要求正装。无的话也要求衬衫。
    明确要求正装。
    要求腾讯会议电脑端,手机APP会特别记录。
    面试群大概200人,长期无通知,要面试前几天会突然发通知,选择某几天的下午/上午场并扫码加入对应群,一个群大概不超过50个人,动作得快,加的晚就满人了,得等到下周。
    本人下午场,12:45要求到电脑前,每人被@到后加入会议,手持身份证,测试设备正常后退出。
    13:45正式开始,按照名单顺序,按JAVA开发-Python开发-C开发-测试-运营的岗位顺序。
    每人点开腾讯会议加入会议,输入会议号,输入密码,等到@到再点击加入会议。
    题目:
    自我介绍(要包括家庭状况)
    为什么选择宁波银行这个岗位?
    为什么不选择其他互联网大厂所在的城市?
    (原话是这样,可以理解为:为什么不选择互联网大厂/为什么不去其他城市)
    有女朋友吗?
    为什么不考研?
    对面试官有其他问题吗?
    整体面试问题比较常规,网上面经都能搜到,可以提前准备。
    整体下来五分钟左右。

    三面-终面
    抽词演讲
    提前20分钟告知主题词,准备后进行一分钟演讲。
    主题词覆盖面满广的,有时事类-精准扶贫等,也有例如市场、乐观悲观等一些词汇。
    演讲完会问几个问题,类似二面-行政面的问题。
    除内容不同外,流程同二面。

    体检
    去合作医院/自行体检,要求三甲医院公务员套餐。

    体检木得问题就发offer

    展开全文
  • Java范例开发大全 (源程序)

    热门讨论 2011-04-27 07:47:22
     第1章 Java开发环境搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7  实例1 开发第一个...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     用JAVA开发的一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录中文件大小及文件增减数目变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
  • java范例开发大全(pdf&源码)

    热门讨论 2013-07-04 13:04:40
    第1章 Java开发环境搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2章 Java...
  • 鉴于市场上用户手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合方式进行移动端Web系统设计研发工作...
  • Java范例开发大全(全书源程序)

    热门讨论 2013-04-05 11:50:26
    第1章 Java开发环境搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java程序 7 第2...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     用JAVA开发的一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录中文件大小及文件增减数目变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     用JAVA开发的一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录中文件大小及文件增减数目变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
     用JAVA开发的一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录中文件大小及文件增减数目变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...
  • 2.3.1 在Eclipse中创建自己第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 2.3.3 通过Eclipse运行Hello World 31 2.4 小结:Eclipse——功能很强大 32 2.5 习题 32 第3章 Java基本数据类型和...
  • 2.3.1 在Eclipse中创建自己第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 2.3.3 通过Eclipse运行Hello World 31 2.4 小结:Eclipse——功能很强大 32 2.5 习题 32 第3章 Java基本数据类型和...
  • 2.3.1 在Eclipse中创建自己第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 2.3.3 通过Eclipse运行Hello World 31 2.4 小结:Eclipse——功能很强大 32 2.5 习题 32 第3章 Java基本数据类型和...
  • Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录中文件大小及文件增减数目变化。...
  • Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型目录监视系统,系统会每5秒自动扫描一次需要监视目录,可以用来监视目录中文件大小及文件增减数目变化。...
  • 银行柜员综合业务平台(j2se),开发工具EditPlus,数据库(从理论上说)记事本,命令行窗口编译、打包、运行,是学习J2se非常好例子,项目是本人学习java过程中做第一个项目,觉得对学习java的同志们有很大...
  • 开发工具java 项目描述:多公存款是商业银行以信用方式吸引企事业单位存款。 业务介绍:单位存款可以分为单位活期存款、单位整存整取定期存款、单位通知存款、单位协定存款。 下面对各种业务进行简单介绍: ...

    软件环境:

    操作系统:AIX,类unix操作系统

    数据库:DB2,数据库,大型数据库

    开发工具:java

    项目描述:多公存款是商业银行以信用方式吸引的企事业单位的存款。

    业务介绍:单位存款可以分为单位活期存款、单位整存整取定期存款、单位通知存款、单位协定存款。

    下面对各种业务进行简单的介绍:

    一:单位活期存款

         1:账户的管理,单位活期存款结算户分为基本存款账户、一般存款账户、临时存款账户和专用存款账户,其中基本存款账户,是一个企业在银行办理的存款取款,转账结算的基本账户,在所用的银行只能开立一个,要在央行备案。一般存款账户,是在基本存款账户开户行之外的银行开立的单位存款账户,可以开设多个,它不可以进行现金的支取。临时存款账户就是单位临时办理存取业务所需要办理的账户,它的最高期限不超过二年。专用存款账户就是单位为了专门的业务,像工程拨款或者教育基金等业务而在银行开设的账户。

        2:单位活期存款账户按照支取方式分为支票户和存折户,支票户就是存款户凭支票等结算凭证到银行办理存取业务的账户,存折户就是存款人凭存折到银行办理业务的账户。

        3:单位活期存款的计提、计息和结息:单位活期存款的计提,每日计提,计算提取,银行为了统计内部每天的收付情况,开设的内部账户,借:利息支出,贷:应付利息。计息,单位活期存款计息方式是积数累积方法,积数=余额*存款,利息=积数*日利率,结息:就是银行在结息日或者存款人支取日把利息从应付利息结算到客户活期存款账户的交易,活期存款每季末月20号位结息日,次日入账。而且计提结息都是发生在日终处理过程,计提包括计提、计息的处理,计提入账等交易。

        计息时间从本季末月21号到下季末月的20号,算头不算尾,即存入日到支取日的前一天为止,利率按照结息日或者支取日的挂牌利率为准;存期按照实际日期。

       4:单位活期存款交易流程,首先是登记客户信息——开户——存款|转账|支取——销户,整个流程基本就是这样,首先是登记客户信息,生成一个唯一标识客户的客户号,然后开户,开设内部账户,之后就可以进行一些基本的账户交易了,不再使用时,就可以销户,销户就是把客户的状态进行修改,而不是删除客户 资料。

    下面说一下单位活期存款交易中涉及到的会计分录:

    开户(包括存款):

    借:柜员现金|其他存款科目|临时存欠

    贷:单位活期存款账户

    付:表外凭证

     

    存款:

    借:柜员现金|单位活期存款账户

    贷:单位活期存款账户

     

    转账:

    借:单位活期存款账户

    贷:单位活期存款账户

     

    支取:

    借:单位活期存款账户

    贷:现金|其他活期存款账户

     

    计提:

    借:利息支出

    贷:应付利息

     

    结息:

    借:利息支出

    借:应付利息

    贷:单位活期存款账户

     

    销户:

    借:单位活期存款账户

    借:利息支出

    借:应付利息

    贷:柜员现金|其他的活期存款账户

     

    二:单位协定存款

         1:单位协定存款概念:单位在银行开设基本存款账户或者一般存款账户之后,可以开设一个协定存款账户,这个账户绑定在活期结算账户上,存款人与银行约定一个金额,超过这个金额,就自动转入协定存款账户,如果活期结算账户的余额不足约定金额,那么再从协定账户转出,一般约定额度为50万,协定存款账户的利率有中央银行规定,采用的积数累积的方式计算利息。

        2:单位协定存款的业务流程:单位活期存款开户——单位协定存款开户——活转定(定转活)——协定存款销户,协定存款的互转发生在日终处理的日切前。

    单位协定存款设计交易的会计分录:

    开户:

    借:单位活期存款账户

    贷:单位协定存款账户

     

    销户:

    借:单位协定存款账户

    贷:单位活期存款账户

         3:计息、计提、结息:单位协定存款计提,每日计提,积数累积法计算利息,结息也是在每季末月20日进行结息,次日入账,利息转入活期结算账户。

     

    三:对公通知存款

        1:概念,单位对公通知存款就是不约定存期,存款人需要支取时提前通知银行的一种存款模式,根据提前通知的时间可以分为一天通知存款和七天通知存款,通知存款有金额的限制,最低存款50万,一次性支取不低于10万,可以一次性支取或者多次支取,不可以转账结算。

       2:计息处理,按照支取日挂牌利率计算利息,如果有以下情况按照活期利率计算

    a:实际存款期限未满足最低存款日期的

    b:没有提前通知,就来提款

    c:提前通知,但是没有到达期限的

    d:支取金额超出或者少于约定金额的

    e:支取金额小于最低支取金额的

    f:支取留存金额小于最低存款金额的

       3:单位通知存款交易流程:首先就是单位通知存款的开户,然后进行提取,可以一次性提取或者多次提取都可以,但是只能一次性存款,然后就是单位存款销户。

     

    四:单位整存整取定期存款

        1:概念,单位长期闲置的资金可以办理单位整存整取定期存款,单位定期存款最低金额为1万元,按照存款期限可以分为三个月、六个月、一年三个档期,可以提前支取或者部提一次。部提,就是部门提取,部提时按照活期存款利率对提取金额进行结息,然后对老账户进行销户,把新账户的余额转到新账户上。

       2:计息处理,单位定期存款计息方式是按照支取日挂牌利率计算,全年按照360天进行计算,采用利随本金的方式计算,如果提前支取或者部提会按照活期利率进行计算。

       3:单位定期存款的业务流程以及涉及到的分录:

    单位定期存款开户——部提|提前支取——销户

    开户:

    借:活期存款账户

    贷:单位定期存款账户

     

    销户:

    借:定期存款账户

    借:应付利息

    贷:单位活期存款账户

    转载于:https://www.cnblogs.com/warrior4236/p/6055722.html

    展开全文
  • 用户信息导入后,就可以机器人工具进行房间机器人分配了。 九、eclipse加载荣耀版时红叉an outline is not available报错处理 很多时候这些错误不是程序问题造成,而是环境问题造成。这个主要是第三方类库...
  • 本书是讲述Delphi最经典的著作之一,作为Delphi的新版本,Delphi 6不仅能帮助程序员高效开发Windows应用程序,简化Web服务、中间软件以及后台数据库系统的合成,还是目前惟一全面支持所有主流业界标准的开发工具和...
  • 本书是讲述Delphi最经典的著作之一,作为Delphi的新版本,Delphi 6不仅能帮助程序员高效开发Windows应用程序,简化Web服务、中间软件以及后台数据库系统的合成,还是目前惟一全面支持所有主流业界标准的开发工具和...
  • 是一个用Java开发的银行卡图片和身份证图片中文字识别的项目,主要包含银行卡图片识别类、身份证背面图片识别类、身份证正面图片识别类,和其它一些工具类,包含日志类,jdbc封装类,xml识别类,特别好用,只...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    主观:不正确的开发方法 忽视需求分析 错误认为:软件开发=程序编写 轻视软件维护 软件危机 产生的原因(软件开发人员的错误观点): “有一个对目标的概括描述就足以着手编写程序了,许多细节可以在以后再补充” ...
  • 这段期间的技术提升:对自定义控件、消息推送、通知、键盘处理、屏幕适配、iPad的开发等实用技术进行锻炼;加强自身对UIKit以及Map Kit的理解以及谓词NSPredicate技术的应用。 体会了真正的MVC思想:视图不依赖于具体...

空空如也

空空如也

1 2 3
收藏数 46
精华内容 18
关键字:

java银行项目用的开发工具

java 订阅