自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 收藏
  • 关注

原创 spring security自定义权限拦截FilterInvocationSecurityMetadataSource

一般情况下,我们如果需要自定义权限拦截,则需要涉及到FilterInvocationSecurityMetadataSource这个接口了。这里有个坑爹的地方。如果用户未登录,但是已经设置了拦截白名单的URL,仍然会进入到权限验证里面来。起初,我以为不会进来,但后来跟踪源代码发现,还是会进来。只是此时的身份是一个匿名用户。其默认的实现为DefaultFilterInvocationSecuri...

2019-07-08 00:43:31 22518 8

原创 spring security如果未登录,返回JSON数据

默认情况下,spring security如果检测到未登录,会返回一个登录页面。对于前后端分离的项目,我们一般是希望能返回自定义的JSON数据。这时候,就需要继承类LoginUrlAuthenticationEntryPoint,并重写其public void commence(HttpServletRequest request, HttpServletResponse response,...

2019-07-08 00:30:03 8779 5

原创 spring boot中 requestBody里面的json数据重新写入到request里

最近在使用spring security框架,发现一个问题,就是我通过request.getInputStream()方法读取了请求体中的json数据后,就发现在controller控制器层中无法再次获取到参数,会出现报错I/O error while reading input message; nested exception is java.io.IOException: Stream ...

2019-07-07 11:37:55 8897

原创 spring boot整合spring security(前后端分离时的json登录方式,解决获取不到用户名密码问题)

如果是自己验证用户名密码的话,spring security仅仅支持传统的form表单方式(form-data)登录。这是一个比较大的坑点。现在都流行使用前后端分离,前端发送的是json格式数据。下面我谈下如何操作。通过跟踪源代码,可以知道,获取用户名密码是在UsernamePasswordAuthenticationFilter这个类里面的attemptAuthentication方法,如下...

2019-07-06 23:13:01 9776 2

原创 spring boot整合spring security(自定义验证方式)

spring security支持传统的查询数据库方式,也即根据用户名查询出用户信息,然后再比较前端传来的密码和数据库中的密码。这种方式很常用。但不适合通过第三方进行的授权认证模式。这时候,我们需要自己处理登录验证过程。针对这些情况,我们需要自定义Authentication Provider@Componentpublic class CustomAuthenticationPr...

2019-07-03 01:05:01 2591

原创 通过反射获取参数名称

通过反射,可以获取到方法的参数类型,返回值类型,方法名称,这些大家应该都清楚,但是能够获取得到参数名称吗?在spring中,通常通过参数名称进行参数匹配并赋值。在JDK1.7版本及以下,我们可以借助于Spring中的类LocalVariableTableParameterNameDiscoverer,来获取得到参数名称。需要注意的是,该方法似乎只对类的方法有效,针对接口的方法无效。使用如下...

2019-05-07 23:46:10 2147

原创 Linux常用命令

cd /etc/sysconfig# umount -vl /mnt/mymount/ 执行延迟卸载延迟卸载(lazy unmount)会立即卸载目录树里的文件系统,等到设备不再繁忙时才清理所有相关资源。卸载可移动存储介质还可以用eject命令。下面这条命令会卸载CD并弹出CD:# eject /dev/cdrom 卸载并弹出CDvi network #编...

2019-05-07 23:21:18 145

原创 Oracle常用命令和语句

1创建用户 create user orcl_user_test identified by orcl_user_test; --删除用户drop user orcl_user_test cascade;2授予权限 grant resource,connect,dba to orcl_user_test;3创建表空间(如果没有则需要创建) create ta...

2019-05-07 23:09:17 253

原创 spring中的RuntimeBeanReference的使用

当我们需要动态注入Bean,并给该Bean的属性注入其他Bean时,比如在Mybatis和Spring的整合中,我们需要动态注入Mapper到spring容器中,而该Mapper如果需要执行SQL语句,还需要持有SqlSessionFactory的引用。但是我们注入时,可能对应的Bean还没有准备好,这时,我们就可以使用RuntimeBeanReference,以保持对实际Bean的引用。在Spr...

2019-05-07 22:58:13 3518

原创 关于spring中的BeanDefinitionRegistryPostProcessor和ImportBeanDefinitionRegistrar接口

这两个接口都可以用于动态注册bean到容器中。BeanDefinitionRegistryPostProcessor实现了BeanFactoryPostProcessor接口,是Spring框架的BeanDefinitionRegistry的后处理器,用来注册额外的BeanDefinition。postProcessBeanDefinitionRegistry方法会在所有的BeanDefini...

2019-05-07 22:49:21 6330 2

原创 java扫描包(包含自己写的包或者jar中的包)及子包下的所有类

不管是在Spring还是Mybatis中,我们都需要配置一个包路径进行扫描类对象。在Spring中,我们需要配置包路径,让Spring容器能扫描包下面的Bean组件。在mybatis中,我们需要配置mapper包路径,以扫描mapper接口,并生成对应的Bean实例。现在,我参照spring的部分源码,来写一个工具类扫描包及子包下的所有类。package com.company.ha...

2019-05-04 22:06:20 1668

原创 创建动态代理对象bean,并动态注入到spring容器中

使用过Mybatis的同学,应该都知道,我们只需要编写mybatis对应的接口和mapper XML文件即可,并不需要手动编写mapper接口的实现。这里mybatis就用到了JDK动态代理,并且将生成的接口代理对象动态注入到Spring容器中。这里涉及到几个问题。也许有同学会有疑问,我们直接编写好类,加入@Component等注解不是可以注入了吗?或者在配置类(@Configuration)...

2019-04-30 00:48:19 35873 11

原创 用动态代理给接口写默认实现,并手动注入到Spring容器中

我们大家都知道,mybatis的mapper接口,我们并没有手动编写实现代码,但仍然能在程序中注入到Spring容器并使用。这里面就用到了动态代理的原理。下面,我也编写一个接口,代码未给出实现,通过动态代理进行接口的默认实现,通过FactoryBean方式注入到容器中(当然,我们也可以通过在一个用@Configuration声明的配置类中,通过@Bean注解,手动编写该实例的生成过程)。下面是...

2019-04-15 00:15:18 4112

原创 springboot2.0与quartz整合

我数据库用的是Oracle数据库,初始化脚本如下:-- 存储每一个已配置的 Job 的详细信息CREATE TABLE qrtz_job_details ( SCHED_NAME VARCHAR2(120) NOT NULL, JOB_NAME VARCHAR2(200) NOT NULL, JOB_GROUP VARCHAR2(200) NOT NULL,...

2019-03-26 08:02:27 695

原创 缓存穿透、缓存雪崩、缓存击穿

redis缓存加快了应用程序的效率,特别是查询。下面我们来讨论下缓存穿透、缓存雪崩、缓存击穿一、缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。解决办法是我们可以将空值也缓存起来,设置一个比较短的过期时间,比如60秒二...

2019-03-12 20:09:48 376

原创 利用JDK动态代理给接口创建动态实现

我们大家都知道,一般情况下,如果一个接口没有实现类的话,我们直接调用该接口的方法会报错。但我们用过的Mybatis中Dao接口,或者Spring Data JPA接口,其实我们没有手动为他们编写实现类,那为什么仍然能正常调用呢?这里就涉及到了动态代理。下面我演示一下,如何利用JDK为一个接口创建动态实现。代码目录大致如下,在com.company.proxy包下有三个类文件一、SaleSe...

2019-03-12 20:09:28 2698 2

原创 maven 将jar包安装到本地仓库

1、首先需要在环境变量中添加mvn命令,使得该命令能在CMD下被识别2、在maven安装目录的conf目录下有一个settings.xml,需要修改该文件中的仓库地址,注意在IDEA项目或者eclipse项目中,也需要手动选择该路径作为仓库地址<localRepository>D:\lichuang\repository</localRepository>3、在...

2019-03-06 20:39:53 197

原创 事务和事务隔离级别,Spring事务传播和隔离级别

一、事务有四大特性,也即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)1、原子性即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换2、一...

2019-03-06 20:39:09 195

原创 【Spring Cloud】微服务概述

对于微服务,业界并没有一个统一的、标准的定义,但通常而言,微服务架构是一种架构模式或者说是一种架构风格。它提倡将单一应用程序划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制(通常是基于Http的restful API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。微服务化的核...

2019-03-03 20:26:14 153

原创 Spring Data JPA 使用本地SQL,并将结果集转换为自定义POJO对象

Spring Data JPA使用很方便,JPA只是一种标准,其实现通常是Hibernate。如果业务仅仅是增删改的话,那用JPA还是很方便的。但通常情况下,我们会有大量的业务查询。如果用其自带的查询,则SQL无法控制,可能会有性能问题。基于此,我们希望扩展下,使其能支持自定义查询SQL,并通过自定义POJO对象进行接收,这样我们就不需要去定义结果集所关联的实体类了。 通过查看源...

2019-03-03 19:37:28 5833 1

原创 Spring Cloud

未完待续

2019-02-22 00:32:21 111

原创 synchronized和ReentrantLock的对比

synchronized:1、依赖于JVM的底层实现;2、获取到锁后,再执行完任务或者出现异常时会自动释放锁;3、是非公平锁,也就是说一个线程可能会多次得到该锁;4、是重量级锁,是悲观锁,类似于数据库直接加for update进行锁住。ReentrantLock:1、是Java的一个类,需要手动编码;2、获取到锁后,需要手动释放,一般是在finally代码块中进行锁的释...

2019-02-22 00:24:40 262

原创 IO和NIO

在谈这个之前,我先谈下以下几个概念。同步和异步,阻塞和非阻塞同步强调的是在获取结果后再进行下一步,异步是说再未获取到结果前不进行下一步。阻塞说的是在获取到结果或者资源前什么都不做,非阻塞是获取到结果或者资源前,还可以做其他事。下面就以A打电话给B,询问今天B家里有没有多的雨伞,进行理解这些概念。同步:A和B保持通话状态,(此时A可以一直等在电话旁,但自己还可以做下其他事,比如...

2019-02-22 00:18:11 106

原创 JVM内存结构

未完待续

2019-02-22 00:15:56 317

原创 Spring AOP 切面@Around注解的具体使用

@Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务。比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@Around注解来实现;再比如我们想在执行方法时动态修改参数值等类似功能的注解还有@Before等等,用到了Spring AOP切面思想,Spring AOP常用于拦截器、事务、日志、权限验...

2019-02-19 23:21:36 159406 22

原创 apache cxf 框架wsdl2java命令的使用(自动生成客户端和服务端代码)

apache cxf 框架wsdl2java命令的使用。-encoding是指定编码类型;-p 指定包名-d 指定生成目录-all生成服务端和客户端代码-client 生成客户端代码-server生成服务端代码wsdl2java -encoding utf-8 -p com.company.cxf.weather -d E:\IdeaProjects\demo1\src...

2019-01-13 21:19:24 2023 1

原创 JVM类加载器及类加载机制

类加载器分为JVM自带的类加载器和用户自定义的类加载器。一、JVM自带的类加载器又分为以下三种启动类加载器(bootstrap)、扩展类加载器、应用(系统)类加载器。其中启动类加载器负责加载$JAVA_HOME\jre\lib路径下的类(常见的比如rt.jar文件,比如java.lang.Object);扩展类加载器负责加载$JAVA_HOME\jre\lib\ext路径下的类...

2018-12-05 22:42:15 292

原创 Apache CXF interceptor拦截器的使用

现在一般很少会用到Webservice了,但有时候和第三方传统机构对接,他们用的可能是WebService。这里写下CXF 拦截器的使用。拦截器分为服务端拦截器和客户端拦截器,又分为入拦截器(in)和出拦截器(out)先讲述一个Webservice请求过程如下。1、首先是客户端发起请求,在请求到达服务端之前,我们可以用客户端出拦截器(client  out  interceptor)进...

2018-12-03 00:19:24 3416

原创 jar包如何在windows、Linux下运行部署

jar包最简单的运行方式莫过于java -jar jar_file_path这种方式,但大部分时候,我们的jar包可能都不支持单独运行,可以采用以下方法1、首先创建以下文件夹或者目录project--bin--config--lib--log2、创建好上述路径后,如果是Windows平台,在bin文件夹下放以下文件base-run.bat和project-run.bat...

2018-10-22 00:18:16 3783

原创 maven项目打包,利用导出功能或者用assembly进行打包

1、maven项目用普通打包<build>        <!-- 打包时包含Properties和XML文件,默认为不包含 -->        <resources>            <resource>                <directory>src/main/java</directory&gt...

2018-10-21 23:46:54 829 2

原创 利用Dom4j解析XML

1、将字符串转换成XML Documentpublic static Map<String, String> getNameSpace() { //处理命名空间        Map<String, String> ns = new HashMap<String, String>();        ns.put(XMLConstants.XML_NS...

2018-10-21 23:32:45 224

原创 Springboot与cxf整合,并进行WebService服务端程序的开发

现在一般都流行用微服务了,但有时候要和第三方对接时,偶尔会用到WebService。这里演示下如何与cxf进行整合,并进行WebService服务发布1、首先在POM中添加以下依赖<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-...

2018-10-21 23:09:00 2643

原创 判断一个字符是否是中文,计算字符长度

判断一个字符是否包含中文可以用正则表达式,但该表达式判断方式并不严谨,可以参照以下代码来判断。以下代码不仅可以判断中文汉字,还可以判断中文标点符号之类的。 private static boolean isChinese(char c) {        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);      ...

2018-10-17 22:28:12 792

原创 通过cxf 进行WebService服务发布(WebService服务端开发及服务发布)

cxf进行WebService服务发布方式有多种,如果是通过Tomcat和Spring整合进行的发布,我之前的博客https://blog.csdn.net/lichuangcsdn/article/details/77921033 里已经介绍过了,这里不再赘述。我这里介绍的是通过jetty方式进行Webservice服务的发布。首先是相关依赖jar包了<dependency&gt...

2018-10-17 00:38:29 3068

原创 如何用java代码(Dom4j),通过XSD文件,对XML进行验证

在XMLSpy中,我们知道如何手动对一个XML文件进行XSD验证,那么如何通过代码进行验证呢?并返回错误信息呢以下代码给出一种具体的方法首先在POM中添加以下依赖<!-- dom4j XML工具包 --> <dependency> <groupId>dom4j</groupId> <artifactId>do...

2018-10-15 01:29:20 2462

原创 通过cxf JaxWsDynamicClientFactory进行WebService 客户端调用

通过JaxWsDynamicClientFactory进行WebService 客户端调用的一个好处就是只需要知道了WSDL地址就行了,不需要手动生成任何代码,这样,如果需要调用多个WebService服务的话,只需要创建多个Client即可,不用考虑传统方式(生成代码)冲突问题,这样可以让代码更优雅。下面给出步骤首先整合相关jar包,在POM文件中添加如下依赖<!-- cxf...

2018-10-15 01:12:31 48031 36

原创 spring boot整合Spring data jpa

1、在maven POM文件中添加如下依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><depe...

2018-09-06 00:25:20 182

原创 Hibernate本地SQL的使用

Hibernate默认的是使用Query对象完成数据库操作,也就是说这里面需要传入的是HQL语句,如果要用本地SQL(也即自定义SQL语句),那么我们一般用的是SQLQuery对象。下面介绍下该对象的一些常见操作1、返回分页查询结果List<T>getSession().createSQLQuery(sql.toString())                .setRes...

2018-09-05 23:47:02 841

原创 Hibernate本地SQL结果集转换为自定义POJO对象

Hibernate如果用于单表的增删改查,其方便性不言而喻,但很多时候我们需要进行关联查询。这时候Hibernate可能不是太方便了。好在Hibernate提供了本地SQL,允许我们手写SQL语句。Hibernate之所以不用手写SQL,是因为Hibernate的实体类对象和数据库字段之间有映射关系。而我们自定义的对象和数据库之间没有明显的映射关系。比如:SQL语句中查询出来的字段一般都...

2018-09-05 23:15:30 1267

原创 静态代理和动态代理

一、静态代理:就是直接由程序员写好的代理类或者在代理类.class文件在编译期间就已经存在了比如一般店铺具备商品出售功能,但店铺也可以把出售商品委托给超市。也就是说我们大家买商品直接到超市买就行了,不用管它是来自于哪个店铺。在这里,店铺(被代理类或者称之为委托对象)和超市(代理类)都必须实现同一个出售商品的接口。1、先创建一个店铺服务接口:/** * 店铺服务,具有出售商品功能 * @auth...

2018-07-12 01:19:00 303

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除