时间轴 · 第 2 页

java开发人脸识别登录-方案(基于阿里云)

阿里云人脸识别服务概述 阿里云目前提供在线的人脸识别相关API,不提供离线SDK。在线API收费标准参考: [ ]() QPS不大于2的情况下,是可以免费调用的。需要事先开通阿里云的人脸识别服务以及OSS服务。 如果需要离线SDK,那么就不能用阿里云了,可以考虑百度云和腾讯云,腾讯云的离线SDK

Shiro学习目录整理

[从宏观的角度了解Shiro——Shiro学习(1)]() [从最简单的示例开始——Shiro学习(2)]() [shiro的身份认证原理——Shiro学习(3)]() [shiro的授权原理与架构简化——Shiro学习(4)]() [shiro的过滤器架构——Shiro学习(5)]() [Spri

shiro的过滤器架构——Shiro学习(5)

shiro的过滤器组织非常庞大,如下图: [ ]() NameableFilter代表的是命名规范,旨在为每一个过滤器命名。提供setName()和getName()接口。 OncePerRequestFilter,确保在一次请求中只通过一次filter。定义了一个doFilterInternal(

shiro的授权原理与架构简化——Shiro学习(4)

看此文之前,应先看上篇文章[shiro的身份认证原理](),因为授权和认证的架构、流程、原理都是差不多的。它涉及到Subject、SecurityManager、Authorizer、Realm这几个概念,跟认证相比,仅仅是将Authenticator换成了 Authorizer 。 shiro的授

shiro的身份认证原理——Shiro学习(3)

首先,有必要回顾下重要的概念—— subject  相当于用户主体 principals 相当于用户名 credentials 相当于用户密码 realms  相当于访问数据库用户身份数据的DAO,在这里可进行用户信息校验 来看shiro的登录操作—— ` Userna

从最简单的示例开始——Shiro学习(2)

用最简单的api,搭建一个最简单的demo。首先建立一个maven项目,pom文件如下: ` <properties<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding</properties<build<plug

从宏观的角度了解Shiro——Shiro学习(1)

一、shiro主要做什么? 1. 身份验证 2. 授权访问 3. 加密 4. 会话管理 二、shiro权限框架的基本开发路线 无论是spring-security还是shiro,权限框架的基本开发路线是围绕“当前用户是谁?这个用户能做什么?”这两个问题进行的。 三、核心概念*1. Subject 主

redis缓存与数据库保持一致

使用redis缓存,通常会考虑到与数据库数据保持一致的问题。 ` public void update(){ updateCache();//更新缓存 updateDb();//更新数据库 } ` 这段代码中,如果更新缓存失败了会抛出异常,那么数据库就不会被更新,缓存一致性得到保障。但是如果

ngrok内网穿透原理浅析

注:本文对ngrok实现内网穿透的原理的浅析,仅仅只是个人根据所学知识,所做的一些推论,并无任何官方认证。如有不同意见,欢迎评论。 第一次使用ngrok实现在公网下访问本地服务的时候,还是挺惊讶的。就很好奇是怎么实现的。查了一些资料,根据自己所学,结合分析了一下,推导出大致的流程。 NAPT原理 在

记一次JMX远程连接失败的问题

今日测试服上发现了一个堆内存问题,想要用jvisualvm远程连接jmx过去查看,但是发现连接失败了。 我赶紧查看服务器上的jvm参数,参数正常—— ` -Djava.rmi.server.hostname=192.168.12.17 -Dcom.sun.management.jmxremote.p

SpringBoot配置文件的继承性和覆写性

项目运行环境有三种,开发环境、测试环境、生成环境,在springboot项目中对应着三个配置文件,application.properites,application-dev.properites, application-prod.properites。 在部署时,用命令运行springboot的

session-count-1.0发布

近期写了一个jar包,放在了maven中心仓库,主要用途是:可在普通tomcat项目、springboot项目、spring-security项目上获取在线用户数量的java组件。 详细的原理介绍和用途、用法在我的另一篇博客中有写——[SpringBoot、security获取在线用户数量]()。

浅谈Mysql 索引原理

本文主要参考自: [https://zhuanlan.zhihu.com/p/113917726]() 为什么需要索引? 假设有1000条数据,id是1、2、3、...1000,如果没有索引,那么查找id=1000的记录,需要从1到1000遍历所有记录,查找效率极低。 怎样的数据结构适合做索引 很

理解CAS

简介 众所周知,synchronize能够保证数据操作的原子性,从而实现同步效果。但是这种通过多个线程竞争锁的方式其效率会比较差,于是java另外实现了另一种无锁的却能保证数据操作原子性的方式——CAS(Compare-and-swap)。 CAS的原理 Compare-and-swap,是一个针对

并发工具类的同步器

本文介绍JDK中并发工具类的各种同步器,倒计时门闩(countdown latch)、同步屏障(cyclic barrier)、交换器(exchanger)、信号量(semaphore)以及phaser同步器。 一、倒计时门闩 java.util.concurrent.CountDownLatch同

关于join()的一个小坑

很多情况下,主线程创建并启动子线程,如果子线程中要进行比较耗时的运算,并且希望主线程等待子线程执行完毕之后再执行。那么就可以使用join()方法,它是线程类Thread的一个用于等待线程对象销毁的方法,底层是wait()方法。 join()的使用比较简单,但是有个小坑需要注意一下。 下面看这个例子:

通过管道进行线程间通信

管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过管道,实现不同线程间的通信,而无须借助类似共享变量、临时文件之类的东西。 在java的JDK中提供了4个类来使线程间可以进行通信: ` 管道字节流 Piped

回顾经典:生产者与消费者模式

等待/通知模式最经典的案例就是“生产者/消费者”模式。但此模式在使用上有几种“变形”,还有一些小的注意事项,但原理上都是基于wati/notify的。《Java多线程编程核心技术》 案例——1对1的生产者与消费者模式 创建一个消费者和一个生产者,生产者每生产一个产品,消费者就会去消费这个产品。在没有

线程通信基础:wait和notify

wait() 方法wait()的作用是使当前执行代码的线程进行等待,它是Object类的方法,用来将当前线程置入“预执行队列”中,并且在wait()所在的代码行处停止执行,直到接到通知或被中断为止。 在调用wait()之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方

synchronize可以锁住一个方法?

记得有一次在面试一个实习生的时候,闻到了一个synchronize的相关问题,他提到“synchronize通过锁住一个方法或者一段代码实现同步效果”。这句话从表面上看其实也没有什么问题,毕竟从代码上看就是这么回事—— ` public synchronized void run() {

volatile关键字与内存模型

对volatile关键字的理解,与java的内存模型的概念是分不开的。 从内存模型说起 java中有个概念叫内存模型,大体是这样的一种结构: [ ]()java内存模型 java内存模型规定了所有的变量都存储在主内存中,即是虚拟机内存的一部分。 每条线程拥有自己的工作内存,线程不能直接读写主内存中的

设计模式之适配器模式

适配器模式 所谓适配器,其实就是在不得不调用某个底层接口规范, 但出于某些需要又必须声明自己专属的接口规范的时候,可以声明一个对象实现自己的接口、同时又调用到该底层接口, 该对象即是适配器。 适配器做了两个接口之间的转换工作, 提供自定义接口的同时又隐藏了实际的底层接口。 角色 适配者对象:Adpt

设计模式之责任链模式

责任链模式 在责任链模式里,一个对象表示链的一个节点,由多个节点对象组成了一条有先后顺序的链对象。有些链对象内部会维护一个数组,来存储这些节点对象,有些则是在每个节点中声明下个节点的引用。 Tomcat中的Filter以及SpringSecurity的拦截器就是使用了责任链模式。 案例1 使用责任链

设计模式之装饰模式

装饰模式 装饰模式(Decorator Pattern)是一种比较常见的模式,动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。 tomcat源码中RequestFacade就是对Request的装饰类。 案例 被装饰者 ` //被装饰者 public class C

设计模式之观察者模式

观察者模式 观察者模式经常被用于监督进度条等场景,其特点如下: 1、观察者模式主要分为两个主体:观察者和通知者,在某些行为触发时,通知者将会通知观察者。 2、观察者需要将自己的对象交给通知者,以便通知者能够调用观察者的方法,进行通知行为。 3、观察者和通知者是多对一的关系。 4、这种模式的缺点在于,

设计模式之模板方法模式

模板方法模式 模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。 比如定义一个操作中的算法的骨架,将步骤延迟到

软引用对象的使用

如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。这通常能够用在缓存删除的场景,让缓存对象实现软引用,那么在内存不够的时候,缓存对象就能被回收,释放内存。 案例1,不使用软引用 jvm参数设置:-Xms5M -Xmx5M -XX:+PrintG

强引用对象并非不会被回收

在《深入理解java虚拟机》第二版中第3章,有写到: 强引用就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。《深入理解java虚拟机》 这段话很容易让人理解成, 类似“Object obj

JVM简单总结

jvm内存区域 [ ]() 1、程序计数器:每个线程都有自己的一个程序计数器,记录所执行的字节码的行号。 2、虚拟机栈:每个线程独有的,生命周期与线程相同。一个方法被执行的时候就会创建一个栈帧,方法的执行至结束对应着栈帧的入栈至出栈的过程。 3、本地方法栈: 与虚拟机栈作用类似,但它只为本地nati

根据JVM日志计算JVM参数

一、程序 ` public class Test5 { public static void main(String[] args) { byte[] b =null; for (int i = 0; i < 10; i++) { b=

JVM日志分析之五

一、程序 ` public class Test5 { public static void main(String[] args) { byte[] b =null; for (int i = 0; i < 10; i++) { b=

JVM日志分析之四

一、程序 ` public class Test4 { public static void main(String[] args) { byte[] b =null; for (int i = 0; i < 10; i++) { b=

JVM日志分析之三

一、程序 ` public class Test3 { public static void main(String[] args) { byte[] b =null; for (int i = 0; i < 10; i++) { b=

JVM日志分析之二

程序 ` public class Test2 { public static void main(String[] args) { byte[] b =null; for (int i = 0; i < 10; i++) { b=ne

JVM日志分析之一

1、程序Test1 ` public class Test1 { public static void main(String[] args) { byte[] b =null; for (int i = 0; i < 10; i++) {

手写原生JS打字小游戏

突然翻到了以前大学时候写过的js小游戏——打字游戏,不得不怀念,那时候的JS是多么的纯洁,没有漫天飞的框架,没有那么多的花里胡哨 。 我将其稍微整理了下,放到我的网站内—— [http://freebytes.net/game/typewrite.html]()

SpringBoot、security获取在线用户数量

session的活跃数量 SpringBoot项目中,session的活跃数量即是在线的用户数量。而session的管理器,就是org.apache.catalina.Manager接口,其抽象实现类ManagerBase具有基本的操作session的方法,其中就有获取session活跃数的方法—

用面向对象的思想开发js小游戏:贪吃蛇

随着前端的发展,js在编码风格领域,也早有了另一番新气象,ES6新增的class关键字,企图为js打造出面向对象的编程风格,另外,各种JavaScript设计模式,也是在将js往面向对象的领域发展。 但是,不得不说,如果将JavaScript作为一种编程语言来使用,是十分牵强的,其自身的弱语言属性,

html的锚链接

html中的a标签可以跳转到不同的页面,这叫超链接;但其实也可以跳转到同页面或不同页面的某个特定节点,这种跳转方式就叫锚链接。实现锚链接的方式非常简单,如下代码: ` <!DOCTYPE html<html lang="en"<head<meta charset="UTF-8"<title>Titl

小程序,想隐藏右上角的分享按钮?

简介 在做小程序的页面设计时,有些UI可能不太了解小程序,设计时把右上角的分享按钮去掉了。 [ ]() 官方文档有错 因此,有些开发员一定会去找办法解决,想把这歌按钮块去掉,但其实,这个按钮是去不掉的。可能有些人看到了官方的文档,以为只要在js的 onLoad 函数中调用一下 [wx.hideSha

wangEditor增加行高和具体字号功能

简介 wangEditor是一个很轻巧的富文本编辑器,这个编辑器在v2版本的时候,带有行高功能,但是在最新的V3版本,却去掉了这个很基本的功能。另外,编辑器的字号功能一直都有很大的限制,只能设置“x-small、small、normal、large”这样的字号,不能设置“12px、14px、16px

Bootstrap响应式导航条的实现原理

Bootstrap官方导航栏 Bootstrap官方导航栏组件的实现效果,是这样的: [ ]()小屏幕及以上( >=768px) [ ]() 超小屏幕 手机(<768px) 可见,屏幕收缩前,导航栏的每个导航项都横向排列在同一行内;屏幕收缩后, 最右端,出现了一个按钮(toggle), 点击t

Bootstrap栅栏系统中的响应式原理探索

栅栏系统与响应式 Bootstrap的栅栏式布局,可以应用在任何一个合适的div上,它将这个div当成是可以划分成12个相同宽度的列的集合。开发者可以在这个div下,书写内嵌div,这些内嵌div可以根据需要占据12个列中的1个或多个列。如下的代码中,是一个简单的示例: ` <div cla

整合SQLite+SpringBoot+JPA

简介 今天在对一个系统设计进行技术选型的时候,纠结于是否继续使用H2轻量级数据库。H2虽然是java编写的,也很适用于java编程的数据库,但是之前在使用时还是发现了一些坑,而且用的人并不算多。于是考虑到了另一个数据库——SQLite。 我想试着把springboot项目跟SQLite结合使用,最好

用visual studio开发C语言项目

简介 用于编写C语言项目的IDE有很多,visual studio是一个不错的选择。 新建项目 第一步,打开visual studio软件,并新建一个c++项目。 [ ]() [ ]() 选择visuall c++,windows控制台应用程序,并新建。 [ ]() 修改c++项目 第二步,将c++

javaIO学习总结篇

简介 本文对javaIO的描述不涉及NIO,仅讲述IO的设计架构、设计思想、部分源码、常用的API及某些重要的细节等。 基础知识 回顾一下相关的基础知识,是很有必要的。 bit: 位。位是电子计算机中最小的数据单位。每一位的状态只能是0或1。比尔盖茨曾经说过,计算机世界都是由0和1组成的。计算机也

Docker部署的wordpress,强制http请求跳转到https

docker部署的wordpress,如果不使用nginx代理,直接使用容器自带的apache2服务配置ssl,其实有些麻烦。我在配置好ssl之后,接着配置http请求强制重定向到https的时候,怎么都不成功。 我是在/etc/apache2/site-enabled/000-default.co

Docker部署http服务器

简介 利用Docker的nginx容器,可以方便的部署一个简单的http服务器 实现步骤 1、下载镜像 ` docker pull nginx ` 2、运行容器 ` docker run -p 80:80 --name http \ -v /home/freebytes/html:/usr/sha