用户接口

使用Optioanl优雅的处理空值

醉酒当歌 提交于 2019-12-04 03:48:56
业务中的空值 场景 存在一个UserSearchService用来提供用户查询的功能: public interface UserSearchService{ List listUser(); User get(Integer id); } 问题现场 对于面向对象语言来讲,抽象层级特别的重要。尤其是对接口的抽象,它在设计和开发中占很大的比重,我们在开发时希望尽量面向接口编程。 对于以上描述的接口方法来看,大概可以推断出可能它包含了以下两个含义: listUser(): 查询用户列表 get(Integer id): 查询单个用户 在所有的开发中,XP推崇的TDD模式可以很好的引导我们对接口的定义,所以我们将TDD作为开发代码的”推动者”。 对于以上的接口,当我们使用TDD进行测试用例先行时,发现了潜在的问题: listUser() 如果没有数据,那它是返回空集合还是null呢? get(Integer id) 如果没有这个对象,是抛异常还是返回null呢? 深入listUser研究 我们先来讨论listUser()这个接口,我经常看到如下实现: public List listUser(){ List userList = userListRepostity.selectByExample(new UserExample()); if(CollectionUtils.isEmpty

SpringMVC文件上传接口设计与实现

旧城冷巷雨未停 提交于 2019-12-04 00:29:37
#1 前两篇文章的铺垫 #1.1 SpringMVC文件上传源码分析前言 #1.2 apache fileupload源码分析 #2 整体的包结构 首先看下整体的包的结构,如下图 总共分成3大块,分别如下 ##2.1 org.springframework.web.multipart 存放Spring定义的文件上传接口以及异常,如 MultipartException对用户抛出的解析异常(隐藏底层文件上传解析包所抛出的异常) 也就指明了,这个体系下只能抛出这种类型的异常,MaxUploadSizeExceededException是MultipartException它的子类,专门用于指定文件大小限制的异常。 用户不应该看到底层文件上传解析包所抛出的异常,底层采用的文件上传解析包在解析文件上传时也会定义自己的解析异常,这时候就需要在整合这些jar包时,需要对解析包所抛出的异常进行转换成上述已统一定义的面向用户的异常 源码见证下: protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException { String encoding = determineEncoding(request); FileUpload fileUpload =

设计模式——个人理解

懵懂的女人 提交于 2019-12-03 21:15:22
写在前面 设计模式是基于固定设计场景的一套解决方案,目的是为了完成开闭原则,或者说面向后续的需求变更,以成本最低的改动和测试完成新功能。同时设计模式也是一种程序员之间的交流语言,可以省去很多沟通成本。 在工作的过程中,从最初不知如何使用设计模式,到中间刻意使用设计模式,到今天稍有好转的正确的使用设计模式,踩了许多坑,也有过度设计的时候,为了避免今后在犯同样的错误,所以准备将自己在项目实践的过程中使用过的设计模式记录下来。 设计模式中,有一些实战里用过,有的没用过,没用过的应该是对这个设计方法没有领悟透彻,所以不知道该怎么用。 目前先按照自己的理解记录下来,有更深的领悟会更新。 创建型设计模式 1、工厂方法模式(FactoryMethod) 工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。” 工厂方法模式,是在抽象类中定义创建对象的方法,调用声明创建过程(抽象方法,但创建对象的过程的实现是在实现类中定义。 也就是说,在创建对象时,创建步骤是固定的,但各个步骤的实现是多种多样的,这种情况下可以使用工厂方法。 例如:创建一个电脑主机,需要安装CPU,内存,硬盘,显卡。这个安装步骤是固定的,但是由不同的工厂实现类去实现这几个步骤。 这种父类声明,子类实现的方式有很多,把这种方法用于创建对象,就叫工厂方法

微信小程序的登入与授权

喜欢而已 提交于 2019-12-03 20:44:30
官方文档: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。 登录流程 说明: 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。 之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。 注意: 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。 临时登录凭证 code 只能使用一次 小程序端执行wx.login后在回调函数中就能拿到上图的code,然后把这个code传给我们后端程序,后端拿到这个这个code后,可以请求code2Session接口拿到用的openid和session_key,openid是用户在微信中唯一标识,我们就可以把这个两个值(val)存起来,然后返回一个键(key)给小程序端,下次小程序请求我们后端的时候,带上这个key

微信授权登录

拜拜、爱过 提交于 2019-12-03 15:32:17
1. 微信登录的两种实现方式   第一种是基于微信公众号进行登录,第二种是基于微信开放平台进行登录。   原因是微信登录不同于QQ登录和微博登录,微信登录没有提供输入账密码登录功能。微信只提供了扫码登录功能,如果是PC端进行登录的话可以用手机进行扫码,但是如果是手机端打开二维码是不能进行扫码的,即便是长按二维码识别功能,但是非常不友好。 2.微信登录的实现方式也有两种   第一种是没有自己的账号体系,直接拉取微信用户信息来进行网站登录。   第二种是有自己的账号体系,授权成功后需要绑定自己的账号。   两种实现方式都可以,只是在向session中存用户信息的时候是存用户获取的微信信息还是根据获取的微信信息(可以根据openID和nickname进行对应查询用户)转换为自己系统内对应的账户信息。 3.基于微信公众号进行授权登录 1.简介   如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。 总的来说,分为四部: 1、引导用户进入授权页面同意授权,获取code 2、通过code换取网页授权access_token(与基础支持中的access_token不同) 3、如果需要,开发者可以刷新网页授权access_token,避免过期 4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

微信JSSdk实现分享功能

戏子无情 提交于 2019-12-03 13:22:00
1. 概述 微信分享服务器的作用是为用户在微信浏览器端对来自网站以及客户端的页面进行二次分享链接时更友好的展示提供服务。为实现二次分享功能需要使用微信JS-SDK来开发. 微信 JS-SDK 是 微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包。微信 JS-SDK 功能很多。 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。 2. 流程图 3. 微信二次分享功能实现的具体步骤 步骤一:绑定域名 (微信公众平台配置) 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 备注:登录后可在“开发者中心”查看对应的接口权限。 需要配置白名单 步骤二:引入 JS 文件 (需要分享的页面) 在需要调用 JS 接口的页面引入如下 JS 文件,(支持 https ): http://res.wx.qq.com/open/js/jweixin-1.4.0.js 如需进一步提升服务稳定性,当上述资源不可访问时,可改访问: http://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持 https )。 <script src="http://res.wx.qq.com/open/js

DDD分层架构的三种模式

笑着哭i 提交于 2019-12-03 11:04:11
引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识。 DDD DDD(Domain Driven Design,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型。在正确实现的情况下,我们通过DDD完成的设计恰恰就是软件的工作方式。 UL(Ubiquitous Language,通用语言)是团队共享的语言,是DDD中最具威力的特性之一。不管你在团队中的角色如何,只要你是团队的一员,你都将使用UL。由于UL的重要性,所以需要让每个概念在各自的上下文中是清晰无歧义的,于是DDD在战略设计上提出了模式BC(Bounded Context,限界上下文)。UL和BC同时构成了DDD的两大支柱,并且它们是相辅相成的,即UL都有其确定的上下文含义,而BC中的每个概念都有唯一的含义。 一个业务领域划分成若干个BC,它们之间通过Context Map进行集成。BC是一个显式的边界,领域模型便存在于这个边界之内。领域模型是关于某个特定业务领域的软件模型。通常,领域模型通过对象模型来实现,这些对象同时包含了数据和行为,并且表达了准确的业务含义。 从广义上来讲,领域即是一个组织所做的事情以及其中所包含的一切,表示整个业务系统。由于“领域模型”包含了“领域”这个词,我们可能会认为应该为整个业务系统创建一个单一的、内聚的和全功能式的模型。然而

Linux防火墙firewalld安全设置

99封情书 提交于 2019-12-03 08:59:28
背景描述 防火墙是具有很好的保护作用。***者必须首先穿越防火墙的安全防线,才能接触目标计算机。在公司里数据安全是最重要的,要求安全部门进行全公司进行服务器防火墙安全搭建,在原有的基础上进行安全的防火墙设置,有效避免安全隐患等问题,建议大家还是花个十多分钟好好看一下防火墙的理论,这样便于后期问题排查,最后一小节有常用命令操作。 主要内容 1 详细了解防火墙相关配置; 2 详细解读相关安全配置方法; 3 详细解读firewalld防火墙的基础知识; 4 了解firewalld防火墙的配置; 5 了解firewalld防火墙相关命令的使用。 1.Linux防火墙概述 防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性。它通过访问控制机制,确定哪些内部服务允许外部访问,以及允许哪些外部请求可以访问内部服务。它可以根据网络传输的类型决定IP包是否可以传进或传出内部网。 防火墙通过审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规则的先后顺序进行一一比较,直到满足其中的一条规则为止,然后依据控制机制做出相应的动作。如果都不满足,则将数据包丢弃,从而保护网络的安全。 Linux系统的防火墙功能是由内核实现的。在2.4 版及以后的内核中,包过滤机制是netfilter.CentOS 6管理工具是iptables,CentOS

03_接口测试例子_待整理

六月ゝ 毕业季﹏ 提交于 2019-12-03 07:32:44
转自: https://home.cnblogs.com/u/feng0815 注:以下用例中所用地址皆为本人在本地所搭的环境,外网无法访问,见谅。 ①、获取用户信息:该接口用于通过userid获取用户信息   请求地址:http://192.168.1.102:8081/getuser   请求方式:POST/GET 入参: 参数 数据类型(长度) 是否必传 备注 userid String Y 用户id 出参: 参数 数据类型(长度) 备注 code int 状态码200为成功,500为异常 age int 年龄 id string 用户id name String 用户姓名 postman中请求如下 jmeter中请求如下: ②、获取用户信息:需要添加header,Content-Type application/json 1.1 请求地址 http://192.168.1.102:8081/getuser2 1.2 请求方式 get/post 1.3 入参 参数 数据类型(长度) 是否必传 备注 userid String Y 用户id 1.4 出参 参数 数据类型(长度) 备注 code int 状态码200为成功,500为异常 userid int 用户id name string 用户名称 age int 用户年龄 postman测试如下,本次入参为json类型

在什么场景下该使用JMX,如何使用,会带来什么好处,这种场景下有哪些替代方案?

被刻印的时光 ゝ 提交于 2019-12-03 07:20:33
一个大系统中,各内部模块系统之间的基于接口方式的互相调用和管理,使用jmx是最佳方案. 带来的好处是 1.面向接口,远程调用对于开发人员是透明的,模块在调用jmx接口时,与调用本地方法几乎相同. 2.可视化的管理界面,通过Jconsole等jmx客户端,可以实时监控系统,并且可实时调用方法进行某些操作. 典型应用场景:  某聊天系统,一台服务器作为 在线用户列表服务器 A1,n台服务器为用户提供聊天业务处理 N1 ,N2,N3..., 一台服务器作为后台管理系统A2.  系统管理员现在进行下面这样一个操作,察看某用户是否在线,找到该用户,发现其在线,则将该用户加入黑名单,并踢下线. 对应的jmx接口可以由以下几个:  A1为A2提供查询在线用户jmx接口,加入黑名单接口,kickout接口, A1为N1..等服务器提供以下接口: 注册业务服务器,添加在线用户.查找黑名单用户 N1...到N3为A1提供kickout接口. 因此在上面的踢下线操作,则由用户在A2的web界面发出,交由A1执行,A1记录黑名单之后,再找到用户所在业务服务器调用N1提供的接口让用户下线. 以上情形是在生产环境下的部署,而在开发工作,则可以将A1,A2,N...N3等功能合并在一个应用中调试. 由于使用的是jmx接口,在本地调试合并之后,可以直接调用应用内部接口方法.