
日积月累
文章平均质量分 63
银河架构师
微信搜索:银河架构师,发现更多精彩内容
展开
-
面试宝典(五):用三个线程按顺序循环打印123三个数字,比如123123123
要使用三个线程按顺序循环打印123三个数字,势必要控制线程的执行顺序,可以使用java.util.concurrent包中的Semaphore类来控制线程的执行顺序。原创 2024-10-24 14:35:14 · 585 阅读 · 0 评论 -
面试宝典(四):Java8的新特性
Java 8(也称为Java SE 8)于2014年3月18日发布,它为Java平台带来了许多重要的新特性和改进。原创 2024-10-23 15:33:58 · 511 阅读 · 0 评论 -
面试宝典(三):如何使用两个线程实现服务提供和服务消费
本次我们来讲一个多线程常见的面试题:如何用两个线程,实现服务提供和服务消费,即一个线程用作服务提供,一个线程用作服务消费?原创 2022-10-24 10:46:24 · 701 阅读 · 1 评论 -
日常开发技巧(一):延迟删除文件
但是,在打印Hello World 1的执行线程中,会随机报错,如果随机数等于3,则抛出异常。但是,如果遇到特殊情况,如文件需要传输、上传到别的平台/系统,完成后尚需校验原始文件和接收文件的MD5以确定完整性。如果文章对您有帮助,请举起您的小手,轻轻【三连】,这将是笔者持续创作的动力源泉。不过,如果只是单次执行某次任务,每次执行完毕后再取消Timer定时器,也是可以的,还是得具体情况具体分析,毕竟适合自己的才是最好的。我是银河架构师,十年饮冰,难凉热血,愿历尽千帆,归来仍是少年!因此,需要延迟删除文件。原创 2022-09-26 15:47:38 · 1087 阅读 · 0 评论 -
多线程编程(二):List组装
因此,不会出现丢失/覆盖数据的情况。比如,拟定一个场景,给定0-9999,共10000个数字,组装2个列表:奇数列表、偶数列表,分别存储到2个列表中。但是,如果有天,业务量激增,单线程已经满足不了需求了,必须使用多线程提升处理速度,那么多线程该怎么处理呢?在日常工作中,难免遇到在循环体中组装List的场景,一般来说,不考虑多线程的话,实现起来非常简单。但是,运行结果却不尽如人意,奇数和偶数列表,并不一定是5000,飘忽不定。运行这段代码,得出的结果也必然是,奇数列表5000个,偶数列表5000个。...原创 2022-08-31 16:02:29 · 576 阅读 · 0 评论 -
多线程编程(一):加减计算
每次执行完之后,都会将计数器减1(countDownLatch.countDown()),在未执行完之前,处于等待状态(countDownLatch.await())。这是因为多线程运行时为并发方式,也许线程尚未执行时,便输出了count的值,此时为初始值0。此时,就需要引入一个新的类,AtomicInteger,可以以原子方式更新int值。感谢您的阅读,我是银河架构师,十年饮冰,难凉热血,愿历尽千帆,归来仍是少年!运行一下,结果与预期一致,count在经过3次加1之后,最终结果为3。运行一下,结果为0。.原创 2022-07-21 15:00:48 · 909 阅读 · 0 评论 -
重温Java基础(八):运算符级别
前情回顾在上一篇文章重温Java基础(七):位运算符中,详细介绍了Java中的位运算符,包括 & ("and")、| ("or")、^ ("xor")、~ ("not")等。同时,也介绍了这些位运算符的一些特殊用法,如取固定二进制位、快速幂、清零等。本章重点本章将介绍Java中的运算符级别。运算符级别 运算符 结合性 [ ] . ( )(方法调用) 从左...原创 2020-07-29 13:49:14 · 322 阅读 · 0 评论 -
史上最简单的Spring Security教程(十六):FilterSecurityInterceptor详解
FilterSecurityInterceptor作为Spring Security Filter Chain的最后一个Filter,承担着非常重要的作用。如获取当前 request 对应的权限配置,调用访问控制器进行鉴权操作等,都是核心功能。先简单看一下FilterSecurityInterceptor类的主要功用。获取当前 request 对应的权限配置,首先是调用基类的beforeInvocation方法。public void invoke(FilterInv...原创 2020-07-29 13:46:34 · 9478 阅读 · 5 评论 -
史上最简单的Spring Security教程(十五):资源权限动态控制(FilterSecurityInterceptor)
在前面的讲解中,我们分别对动态用户、动态权限的实现做了相关介绍。可能大家在看的过程中,会发现一个问题:目前都是通过注解控制权限的,并且角色是事先定义好的,且需要数据库、Java程序保持一致。这是非常不友好的,不能自由的定义角色及其所能控制的资源。角色比较少且固定的业务场景还好,如OA,只有管理员和普通用户两种角色。但是遇到大型业务系统,角色细且繁多,需要自定义,且需要频繁变更其所拥有的资源,那么,目前的形式就显得非常笨拙。接下来,就如何进行资源权限动态控制进行讲解,要实现的目标为:Java程序...原创 2020-07-27 10:26:36 · 3682 阅读 · 9 评论 -
史上最简单的Spring Security教程(十四):动态权限(自定义UserDetailsService)
在前面的示例中,我们在自定义的UserDetailsService中,固化了用户所拥有的的权限,即User。其实,这和最早我们在配置文件配置用户的用户名、密码、权限列表并无二致,这种固化的方法尤其独到之处,但却并不适合所有业务场景。本例,我们来说一下如何实现动态权限。首先,定义角色表、角色用户关联表。create table SYS_ROLE( ID varchar(32) not null comment '主键', NAME...原创 2020-07-27 10:23:43 · 3824 阅读 · 0 评论 -
史上最简单的Spring Security教程(十三):动态用户(自定义UserDetailsService)
前面我们讲过的例子,都是在配置文件中配置的用户信息,包括用户名、密码、角色等,而这些,会被初始化到InMemoryUserDetailsManager中,即存储在内存中。但是,在实际的业务场景中,不可能只有一个用户,更不可能用户信息都是固定的,而是动态的,需要从存储的地方获取,如数据库。首先,我们把用户信息存储在数据库中,创建数据库springsecuritylearning,编码方式utf8mb4,排序规则utf8mb4_bin。然后定义用户表SYS_USER。crea...原创 2020-07-23 15:12:40 · 4205 阅读 · 0 评论 -
史上最详细的WordPress安装教程:终极篇
WordPress是一款能建立出色网站、博客或应用的开源软件。其设计美观、功能强大,同时开源免费。35%的网站都在使用WordPress,小到兴趣博客,大到新闻网站(官网数据)。有了WordPress就有了无限可能。 可自定义设计 友好的SEO 响应式移动网站支持 高性能 随时随地管理 高安全性 强大的媒体管理 简单且无障碍 利用超过55,000个插件帮助您扩展WordPress,让网站满足需求。也可以增加一个.原创 2020-07-20 16:34:38 · 5162 阅读 · 2 评论 -
史上最详细的WordPress安装教程(六):安装WordPress
WordPress官网下载安装源码,也可以在中文官网下载中文版:https://cn.wordpress.org/download/。如果一直429,那就百度其它下载资源吧,无解。下载源码包之后,通过ftp、ssh等相关工具上传到服务器,也可以使用wget命令直接下载到服务器,省的来回传。原创 2020-07-20 16:28:23 · 58784 阅读 · 2 评论 -
史上最简单的Spring Security教程(十二):@PreAuthorize注解实现权限控制
我们前面讲的所有的例子,都是没有权限控制的,也就是只要登录就可以访问任何资源,不需要其它的权限。但是,现实生活中肯定不是这样。比如你是普通员工,只能查看自己的工作记录;而部门经理作为领导,则可以查看整个部门员工的工作记录;再如企业老板,作为最大的权限拥有者,可以查看整个公司员工的工作记录。这就是所谓的权限控制,不同角色拥有的不同资源。而Spring Security框架最大的功用就在于此。当然,实现权限控制体系非常复杂,我们一步一步来,本次先讲一个如何通过注解实现权限控制需求。Spri...原创 2020-07-17 17:11:11 · 32654 阅读 · 7 评论 -
史上最详细的WordPress安装教程(五):安装phpMyAdmin
官网下载安装包官网地址为 https://www.phpmyadmin.net/,点击 Download,可以跳转到安装包下载界面。选择下载历史版本,也可以下载最新版本,最新版本在右上角有按钮,可直接下载。历史版本可通过点击Download按钮,寻找历史版本下载页面。经过一系列查找,历史页面下载地址为:https://www.phpmyadmin.net/files/。选择下载4.8.3版本。下载好之后,可通过ftp、ssh等工具将压缩包上传到服务器。也可以复制下载链接,直...原创 2020-07-17 17:07:43 · 2178 阅读 · 0 评论 -
史上最简单的Spring Security教程(十一):url区分不同的登录失败场景
前面我们自定义了登录失败页面,其中有简单的登录失败原因的展示。不过,有更为特殊的业务场景,需要从url中区分不同的用户登录失败场景,以方便其它关联操作。如用户名密码错误/login_fail?error=1,账号锁定/login_fail?error=2等。先定义几种常见的登录失败类型。FAILURE(0, "登录失败!"),BADCREDENTIALS(1, "用户名密码错误!"),LOCKED(2, "用户已被锁定,无法登录!"),ACCOUNTEXPIRED(3, "..原创 2020-07-15 16:09:30 · 2556 阅读 · 2 评论 -
史上最详细的WordPress安装教程(四):安装mysql 5.7
安装mysql添加源rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm#或wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpmrpm -ivh mysql57-community-release-el7-9.noarch.rpm安装yum -y install mysql-communi...原创 2020-07-15 16:04:04 · 1619 阅读 · 1 评论 -
史上最详细的WordPress安装教程(三):安装php 5.6及php-fpm、php-pdo、php-mysql等插件
安装php 5.6yum -y install epel-releaserpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpmrpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remiyum install --enablerepo=remi --enablerepo=remi-php56 php php-gd php-opcache php-devel ph原创 2020-07-12 17:12:41 · 2386 阅读 · 0 评论 -
史上最详细的WordPress安装教程(二):Apache服务安装
安装Apacheyum -y install httpd注意:该方法安装完毕后,Apache配置文件路径为 /etc/httpd/conf/httpd.conf命令执行完毕后看不到效果,这时可使用命令查看Apache服务状态service httpd status或者systemctl status httpd.service开启服务systemctl start httpd.service关闭服务systemctl stop httpd.ser...原创 2020-07-07 15:15:23 · 3069 阅读 · 0 评论 -
最详细的WordPress安装教程(一):简介及环境准备
简介WordPress是一款能建立出色网站、博客或应用的开源软件。其设计美观、功能强大,同时开源免费。35%的网站都在使用WordPress,小到兴趣博客,大到新闻网站(官网数据)。有了WordPress就有了无限可能。 可自定义设计 友好的SEO 响应式移动网站支持 高性能 随时随地管理 高安全性 强大的媒体管理 简单且无障碍 利用超过55,000个插件帮助您扩展WordPress,让网站满足...原创 2020-07-07 15:11:54 · 3408 阅读 · 3 评论 -
史上最简单的Spring Security教程(十):AuthenticationFailureHandler高级用法
在前面,我们简述了如何自定义用户登录失败页面。但是,在工作中,所遇到的业务场景压根不会这么简单。比如要求记录登录失败时的IP、时间、SessionId;发送登录失败提醒到微信、邮箱、短信,提醒用户当前登录失败事件;同时记录到日志中,或者发送到远端日志监控平台,分析是否是攻击行为等等。而这一切,Spring Security框架非常贴心的提供了AuthenticationFailureHandler接口,当然了,框架同时也提供了一些简单的实现,最重要的,用户可自行扩展,以满足不同的业务场景...原创 2020-07-07 15:09:56 · 12706 阅读 · 7 评论 -
史上最简单的Spring Security教程(九):自定义用户登录失败页面
生活中肯定存在这样的场景,在登录某个网站时,难免会忘记密码,或是验证码输入错误,造成多次尝试。所以,有必要适度的提醒用户,到底是什么原因造成了登录失败,如用户名密码不正确、验证码错误等等。由于Spring Security框架自带的登录失败url为/login?error,除了知道是登录失败了,其它的,可以说是毫无用处。所以,需要我们自定义用户登录失败页面。先来做一个简单的登录失败页面,简单的展示一下失败信息。......<div class="col-sm-12 ...原创 2020-07-03 16:04:11 · 3108 阅读 · 0 评论 -
史上最简单的Spring Security教程(八):用户登出成功LogoutSuccessHandler高级用法
大多数业务场景下,自定义登出成功页面也满足不了一些要求,更别提默认的登出成功页面。这时候,就需要别的方案支持,幸运的是,Spring Security框架还真就非常贴心的提供了这样一个接口LogoutSuccessHandler, 专门用于处理用户登出成功请求。当然了,对于LogoutSuccessHandler接口,Spring Security框架有一些默认的实现,也可以自行扩展。同用户登录成功的业务场景,在用户登出成功后,我们也要通过邮件、短信、微信,来通知用户,在什么时间,什么...原创 2020-07-01 11:16:32 · 12792 阅读 · 6 评论 -
史上最简单的Spring Security教程(七):用户登出成功url配置
Spring Security框架默认的用户登出成功url为/login?logout,大多数情况下,由于种种原因,这都不满足我们的业务场景,都需要自定义。Spring Security框架自定义用户登出成功url也比较简单。http.logout().logoutSuccessUrl("/logout_success").permitAll()这里的permitAll()非常重要,还记得之前Spring Security框架默认的用户登出成功url为/login?log...原创 2020-07-01 11:14:30 · 2770 阅读 · 2 评论 -
史上最简单的Spring Security教程(六):用户登出
既然有用户登录,势必就会有用户登出,Spring Security也提供了比较详细的登出配置。其实,之前的程序中,依然支持用户登出,不知道有人点过退出登录按钮没有,结果是404。其实,原因也很简单,我们的退出登录按钮使用超链接实现的,而超链接是 GET 方式请求的,在Spring Security用户登出配置中,CSRF默认是开启的,并没有关闭,不支持 GET 类型的用户登出请求。因此,就会抛出404的错误码。...... if (http.getConfigurer(...原创 2020-07-01 11:12:37 · 3875 阅读 · 1 评论 -
因为一句代码,老大差点拿我祭旗!Spring Security authorizeRequests 顺序问题不容忽视
今天,老大给我布置了一个非常简单的任务,真的非常简单:开发一个个人基本信息展示页面,展示个人的一些基本信息,并且权限配置要配置为无需登录即可访问。感谢大哥照顾我,给我这么简单的任务,那就开干吧。一顿操作猛如虎,页面写完后,到Spring Security的配置方面,不就是无权限认证嘛,还不是手到擒来。http..authorizeRequests().antMatchers("/user/profile/**").permitAll()这么简单的东西,没有必要再走各种测试流程...原创 2020-06-25 18:40:56 · 6337 阅读 · 3 评论 -
史上最简单的Spring Security教程(五):成功登录SuccessHandler高级用法
在了解了如何简单的配置成功登录后调转的页面、如何始终指定系统跳转到某一地址后,我们可能会庆幸,原来如此简单。是的,确实如此简单,Spring Security框架协助我们完成了大部分的工作,而我们只需稍微配置,即可使用。但是,业务场景,又何尝会如此简单。举个例子,我们在登录某个网站之后,微信、短信、邮箱可能会接受到一条这样的信息/邮件。还有,比如这样的。甚至于,我要记录每一次的登录信息到数据库、到日志文件等等,方便后续做审计、分析。其实,Spring Security框架也...原创 2020-06-25 18:39:18 · 8145 阅读 · 0 评论 -
史上最简单的Spring Security教程(四):成功登录页面
配置大多数情况下,我们在访问一个系统时,会直接访问我们收藏的某个页面,或者首页,又或者是访问根路径,成功登录系统后,一般情况下,会重定向到这些页面。如果并没有明确的目的指向,或者说我们想要让系统在登录成功后,一直指向某个页面怎么办?其实,这很简单,很显然,Spring Security 也考虑到了这一点,在原配置基础上,添加一项defaultSuccessUrl配置即可。http.formLogin().loginPage("/login").defaultSuccessUrl...原创 2020-06-24 08:56:49 · 5842 阅读 · 0 评论 -
史上最简单的Spring Security教程(三):不拦截系统资源
前面我们自定义了登录页,当然了,系统也有一些其它的页面,但是,这些页面犹如没有“化妆”一样,非常不美观。既然如此,我们就使用Bootstrap、font-awesome等前端技术,给页面“化化妆”。...<link type="text/css" rel="stylesheet" th:href="@{/css/bootstrap.min.css}" href="../static/css/bootstrap.min.css"><link type="text/css"...原创 2020-06-22 09:58:24 · 5484 阅读 · 1 评论 -
史上最简单的Spring Security教程(二):自定义登录页
用法Spring Security框架默认的登录页如下图所示。这个界面元素太少,况且不易去调整,也不满足日常的场景。所以,大多数情况下,我们需要自定义登录页。其实,自定义登录页也非常简单,只需要一个登录页面、一个Controller、Spring Security配置稍微调整下,就可以了。登录页面我们采用Spring Security框架默认的用户名、密码参数名、filterProcessUrl等。<form action="/login" met...原创 2020-06-22 09:56:14 · 4415 阅读 · 3 评论 -
史上最简单的Spring Security教程(一):一分钟搭建SpringSecurity
说起来Web应用安全,通用的方案无非 Spring Security 和 Apache Shiro。这两者我们在此不做比较,用Spring Security多,无非是因为 Spring 框架的“裙带关系”,当然了,也有一些其它原因,如CAS集成、OAuth2集成等等,都有比较成熟的集成框架方案。Spring Security框架,说实话,比较复杂,好多人一开始不太理解,只会照搬网上的答案,遇到问题解决不了。这是非常不好的习惯,技术方案一定是自己能解决的,或者说比较容易找到解决方案的,不然生产环境出...原创 2020-06-20 16:00:45 · 6478 阅读 · 7 评论 -
Redis生成分布式唯一流水号实践
在工作中,想必都接触过这样一个场景:生成具有一定规则的编码。比如,合同编号。要求格式为<HT前缀><4位年><2位月><2位类型><N位流水号>。前面都好说,只有这个流水号,很容易就出现重复、跨越等问题。如何解决呢?其实办法也有好多种,能想到的最多就是加锁。无论是synchronized关键字、还是Lock锁、Zookeeper锁、Redis锁等,都是通过阻塞其它请求,即同步阻塞模式,一次只处理一个流水号生成请求,以达到唯一性目的。那么有没有同步非阻塞模式呢?答案是有的,且使用起来也比较简单原创 2020-06-17 14:12:52 · 4867 阅读 · 0 评论 -
Spring Security Oauth2 SSO单点登录配置及原理深度剖析
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。随着企业各系统越来越多,如办公自动化(OA)系统,财务管理系统,档案管理系统,信息查询系统等,登录问题就变得愈发重要。要记录那么多的用户名和密码,实在不是一件容易的事儿。而为了便于记忆,...原创 2020-06-15 09:20:02 · 14904 阅读 · 12 评论 -
可能是最全的Thymeleaf参考手册:终极篇,全,全,全!!!
Thymeleaf是一个现代的、服务器端的Java模板引擎,适用于Web和独立环境。其主要目标是为开发工作流程带来异常优雅的自然模板——可以再浏览器中正确显示HTML,也可以作为静态原型,使开发团队协作更通畅。目前Thymeleaf已于Spring Framework集成,相信凭借Spring Framework的出色特性,能使Thymeleaf成为现代HTML5 JVM Web开发的首选。Thymeleaf全部的参考手册如下:可能是最全的Thymeleaf参考手册(一):配置 可能是最全的T原创 2020-06-11 17:05:13 · 1742 阅读 · 0 评论 -
可能是最全的Thymeleaf参考手册(十六):模板解耦逻辑
解耦逻辑:概念到目前为止,模板都是以正常的方式完成,逻辑以属性的形式插入模板中。但是Thymeleaf还允许我们将模板标记与其逻辑完全分离,从而允许在HTML和XML模板模式下创建完全无逻辑的标记模板。主要思想是模板逻辑将在单独的逻辑文件中定义(更确切地说是逻辑资源,因为它不必是file)。默认情况下,该逻辑资源将是与模板文件位于同一位置(例如,文件夹)的附加文件,其名称相同,但扩展名为.th.xml:/templates+->/home.html+->/...原创 2020-06-10 10:12:48 · 464 阅读 · 0 评论 -
可能是最全的Thymeleaf参考手册(十五):模板缓存
Thymeleaf的工作要归功于一组解析器(用于标记和文本),该解析器将模板解析为事件序列(打开标签,文本,关闭标签,注释等)和一系列处理器(每种需要一种行为)应用–修改模板解析的事件序列,以便通过将原始模板与我们的数据结合来创建我们期望的结果。默认情况下,它还包括存储已解析模板的缓存;在处理模板文件之前读取和解析模板文件所导致的事件顺序。在Web应用程序中工作时,此功能特别有用,它基于以下概念: 输入/输出几乎始终是所有应用程序中最慢的部分。相比之下,内存中处理非常快。 克隆现有...原创 2020-06-10 10:10:30 · 651 阅读 · 0 评论 -
可能是最全的Thymeleaf参考手册(十四):其它配置
模板解析器在web项目中,我们使用ITemplateResolver的实现ServletContextTemplateResolver,用以从Servlet上下文中获取模板作为资源。除了通过实现ITemplateResolver来创建模板解析器之外,还包括一下四种实现: org.thymeleaf.templateresolver.ClassLoaderTemplateResolver,它将模板解析为类加载器资源,例如: return Thread.current...原创 2020-06-10 10:08:53 · 1492 阅读 · 0 评论 -
可能是最全的Thymeleaf参考手册(十三):文本模板模式
文字语法在Thymeleaf的三种模板模式被认为是文字:TEXT,JAVASCRIPT和CSS。这将它们与标记模板模式区分开:HTML和XML。文本模板模式和标记模式之间的主要区别在于,在文本模板中,没有标签可以插入属性形式的逻辑,因此我们必须依靠其他机制。这些机制的第一个也是最基本的是内联的,我们已经在上一章中进行了详细介绍。内联语法是在文本模板模式下输出表达式结果的最简单方法,因此,这是文本电子邮件完美有效的模板。Dear [(${name})], Please fi...原创 2020-06-10 10:05:09 · 2237 阅读 · 0 评论 -
可能是最全的Thymeleaf参考手册(十二):内联
表达式内联尽管标准方言允许我们使用标记属性来执行几乎所有操作,但是在某些情况下,我们更喜欢直接将表达式写到HTML文本中。例如,我们可能更喜欢这样编写:<p>Hello, [[${session.user.name}]]!</p>以代替:<p>Hello, <span th:text="${session.user.name}">Sebastian</span>!</p>在Thymeleaf中,[[....原创 2020-06-05 09:37:58 · 702 阅读 · 1 评论 -
可能是最全的Thymeleaf参考手册(十一):注释和块
Thymeleaf模板中的任何位置都可以使用标准的HTML / XML注释<!-- ... -->。这些注释中的所有内容均不会被Thymeleaf处理,并将一字不差的复制到结果页面:<!-- User info follows --><div th:text="${...}"> ...</div>Thymeleaf解析器级注释块解析器级别的注释块是在Thymeleaf对其进行解析时,将从模板中简单删除的代码。他们...原创 2020-06-04 11:35:27 · 479 阅读 · 0 评论