<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[milanleon的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/milanleon</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; milanleon]]></copyright><item><title><![CDATA[使用Spring Security进行登录认证]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/156145416</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/156145416</guid><author>milanleon</author><pubDate>Mon, 29 Dec 2025 16:34:41 +0800</pubDate><description><![CDATA[下面的Controller方法中都没有对参数值为null做判断处理，因为只有请求通过了Spring Security认证或者请求的是无需认证的公开路径（请求不会被 Spring Security过滤器链过滤）或者请求的路径授权规则被设置为为.permit()即无需认证，对应的Controller方法才会执行，如果请求没有被认证通过（比如请求无携带token、token过期、无权限等），会触发过滤器链中设置的异常处理。Security 配置类用来提供Spring Security的相关配置工作。]]></description><category></category></item><item><title><![CDATA[前端路由 ]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/149749121</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/149749121</guid><author>milanleon</author><pubDate>Tue, 29 Jul 2025 18:01:59 +0800</pubDate><description><![CDATA[一个网站的注册流程有3步：填写基本信息-验证手机-设置密码，前端路由可以用动态参数记录当前步骤，例如第1步的URL为https//example.com//register/step1，第2步的URL为https//example.com//register/step2，第3步的URL为https//example.com//register/step3，当用户在第2步刷新页面时，前端路由根据step2参数，自动展示第2步的表单内容（配合本地存储还能恢复已填内容）。④、实现URL状态保存。]]></description><category></category></item><item><title><![CDATA[Windows下C++使用SQLite]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/144749912</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/144749912</guid><author>milanleon</author><pubDate>Thu, 26 Dec 2024 18:30:31 +0800</pubDate><description><![CDATA[使用vs命令行工具生成.lib文件：进入dll和def文件所在的目录，执行lib /DEF:sqlite3.def /OUT:sqlite3.lib /MACHINE:x86后获得.lib文件，这样就可以通过dll文件、lib文件、头文件来开发SQLite了。页面，下载sqlite-dll-win-x86-*.zip、sqlite-amalgamation-*.zip、sqlite-tools-win-x64-*.zip三个包，这三个包里分别包含dll文件和def文件、头文件、exe工具。]]></description><category></category></item><item><title><![CDATA[JavaScript【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/131980160</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/131980160</guid><author>milanleon</author><pubDate>Fri, 01 Sep 2023 10:57:46 +0800</pubDate><description><![CDATA[addEventListener()的第三个参数为布尔类型，默认为false, 其指定事件传播的顺序，比如  元素内有一个 ，然后用户点击了这个  元素，false的话表示消息从内到外处理，即首先处理  元素的点击事件，然后是  元素的点击事件，true的话表示消息从外到内处理。这里有两个问题，一个是coorDiv上面会有空隙，这是因为右边的p段落显示的时候默认会有上面的空隙，如果我们把p段落的margin设为0的话，那么coorDiv和p段落上面都没有了空隙。]]></description><category></category></item><item><title><![CDATA[HTML总结2 [转]]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/131995950</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/131995950</guid><author>milanleon</author><pubDate>Wed, 23 Aug 2023 13:47:18 +0800</pubDate><description><![CDATA[BootStrap也提供了很多css样式和js插件，使得web开发更加便捷，这块与vue相比的话，BootStrap的缺点是，如果使用BootStrap现成的插件进行开发的话会很快，但是想对于组件进行订制就不太方便，自定义标签或部件的话需要一些额外的代码或查找额外的插件，而vue则适合开发自定义功能和交互比较多的web。表单用于收集用户的输入，如下图所示， 用来定义表单，表单中的元素有input 元素（如text文本输入、radio单选按钮、submit提交按钮）、单选按钮、文本输入框等。]]></description><category></category></item><item><title><![CDATA[HTML总结1【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/129791409</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/129791409</guid><author>milanleon</author><pubDate>Wed, 23 Aug 2023 13:46:17 +0800</pubDate><description><![CDATA[div/span 通过与 id、class 、role 属性配合，提供了向html文档添加额外结构的机制，如果这个结构是通用的话使用class属性，如果这个结构是特定块使用的话使用id属性，id 属性为一个元素或多个元素(div块)分配一个唯一的名字，class属性则适合被多次使用的情况。从上面可以看到，我们可以通过样式表来设置一些通用的样式，比如每个色块使用的inside来实现相同的大小，同时还可以对每个元素设置单独的样式，比如通过色块的style属性来设置色块的单独颜色。]]></description><category></category></item><item><title><![CDATA[Spring Cloud【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/127089258</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/127089258</guid><author>milanleon</author><pubDate>Fri, 17 Mar 2023 16:27:31 +0800</pubDate><description><![CDATA[比如对于分布式应用，有多个Spring Boot应用，可以使用Spring Cloud Config来提供一个通用的分布式应用配置解决方案，它包括Config Server和Config Client，使用Config Server作为配置服务器来读取配置并向Spring Boot应用发送配置，各个Spring Boot应用在启动时使用Config Client向服务器请求配置。​​​​​​​项目这篇文章中Spring Cloud Config部分。]]></description><category></category></item><item><title><![CDATA[Jmeter]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/127276906</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/127276906</guid><author>milanleon</author><pubDate>Fri, 14 Oct 2022 13:21:25 +0800</pubDate><description><![CDATA[循环次数”为每个线程的请求次数，比如有100个线程，设置了循环次数为10，那么总请求次数就为1000，设置为永远的话为线程一直发送请求。需要注意的是“循环次数”指的是每个线程的循环次数，比如线程数设置为2，Ramp-Up时间设置为10，循环次数设置为2的话，第一个线程在测试开售后就执行请求，结束后会立即再次执行请求，第二个线程在5秒后才开始执行请求，执行结束后立即再次执行，一共执行了4次请求。异常% ：请求错误率，错误的请求的数量 / 请求的总数。95 % Line：95 % 用户的响应时间。]]></description><category></category></item><item><title><![CDATA[curl、Postman、HttpClient]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/127245100</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/127245100</guid><author>milanleon</author><pubDate>Wed, 12 Oct 2022 09:55:00 +0800</pubDate><description><![CDATA[Post还有很多其它功能：可以将发送的请求保存和通过collection进行归类，以便后续的测试。-d用来设置请求体附带的数据，默认使用POST请求：curl -d '{"user_id": "123", "coin":100, "success":1, "msg":"OK!-h用来设置请求的首部行（请求头），如 curl -h 'Accept-Language: en-US' -h 'Content-Type: application/octet-stream' https://google.com。]]></description><category></category></item><item><title><![CDATA[Web相关工具和框架]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/127126026</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/127126026</guid><author>milanleon</author><pubDate>Wed, 12 Oct 2022 09:54:00 +0800</pubDate><description><![CDATA[如下所示，我们的服务首先向Dubbo的注册中心进行注册（发送服务的IP、端口、接口方法），消费者向注册中心订阅服务（发送所求的服务信息）以发现服务，注册中心根据消费者所求服务信息匹配对应的提供者列表给消费者，然后消费者从服务提供者地址列表中，基于软负载均衡算法选一台服务提供者进行调用。Dubbo：A服务能提供3种服务功能（接口），B服务能提供4种服务功能，C服务能提供5种服务功能，A服务也许需要使用B服务的功能，B服务需要使用C服务的功能，那让我们组合一波服务搞点事情吧。]]></description><category></category></item><item><title><![CDATA[ZooKeeper]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/127102061</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/127102061</guid><author>milanleon</author><pubDate>Fri, 30 Sep 2022 16:42:46 +0800</pubDate><description><![CDATA[B、C系统同时也是会判断自己创建的是不是最小的那个节点，发现不是，那么B系统监听比自己小1的节点，即A系统创建的节点变化，C系统监听B系统创建的节点的变化，当A操作共享资源结束后，将自己的节点删除，这时候B会监听到，B则成为了最小的节点，B获得了锁......当然，系统在访问locks的时候，发现没有其它系统在访问的话（/locks下只有自己创建的一个子节点），则直接获得锁。通过监听+Znode节点，ZooKeeper就可以用来做：配置管理、命名服务、分布式锁、集群管理、负载均衡。]]></description><category></category></item><item><title><![CDATA[Spring Boot（2）【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/126953946</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/126953946</guid><author>milanleon</author><pubDate>Wed, 28 Sep 2022 14:37:16 +0800</pubDate><description><![CDATA[然后，在发送方就可以注入一个RabbitTemplate来发送消息，如下所示的sendRegistrationMessage()方法会将消息发送到registration这个Exchange，而且没有指定Routing Key，所以消息会发送到q_mail和q_sms这两个Queue，sendLoginMessage()方法会根据消息的success标志来判断是否设置Routing Key为"login_failed"，也就是成功的消息会发送到q_app和q_mail，失败的消息会发送到q_sms。]]></description><category></category></item><item><title><![CDATA[Spring Boot（1）【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/126345186</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/126345186</guid><author>milanleon</author><pubDate>Tue, 20 Sep 2022 15:15:10 +0800</pubDate><description><![CDATA[可以使用使用spring-boot-thin-launcher，如下所示修改pom.xml，这样生成的jar包只有几十K（只包含我们自己代码编译后的class以及一些其它信息），使用java -jar jar_name.jar命令运行这个jar包的话，会先在指定目录搜索看看依赖的jar包是否都存在，如果不存在，先从Maven中央仓库下载到本地，然后，再执行main()方法启动程序。Spring Boot大量使用自动配置和默认配置，极大地减少了代码，通常只需要加上几个注解，并对配置文件配置以下即可。]]></description><category></category></item><item><title><![CDATA[Spring MVC（2）【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/126747961</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/126747961</guid><author>milanleon</author><pubDate>Wed, 14 Sep 2022 16:44:42 +0800</pubDate><description><![CDATA[然后就可以启动jconsole来调用BlacklistMBean中的相关方法，如下所示，先找到程序进程，选择MBean标签，然后在sample下就可以看到我们自己的MBean——blacklist，其属性和操作也能看到，如下所示，我们可以点击addBlacklist操作，填入参数127.0.0.1后点击addBlacklist按钮，这就相当于调用了BlacklistMBean的addBlacklist()方法，即对黑名单添加了IP（如果使用IPv6，那么需要把。电子邮件一旦到达MDA，就不再动了。]]></description><category></category></item><item><title><![CDATA[Spring MVC（1）【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/126261372</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/126261372</guid><author>milanleon</author><pubDate>Tue, 13 Sep 2022 14:50:17 +0800</pubDate><description><![CDATA[返回重定向时可以直接返回String。Tomcat在8之前采用的是BIO模式，虽然它并没有为每个请求创建一个线程，而使用的是线程池，但一个HTTP请求从头到尾都也还是由某一个线程来处理，所以这就带来了线程池中线程消耗殆尽问题（假如线程池中有20个线程，而同时也有20个请求正在进行，且每个请求里的操作都是耗时操作，这时候再来一个请求的话Tomcat就不能对其进行处理)。有的网站提供给客户选择使用语言的功能，当用户选择了指定的语言后，Spring MVC会将用户的选择放到特定的Cookie中。]]></description><category></category></item><item><title><![CDATA[Hibernate和MyBatis【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/125894778</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/125894778</guid><author>milanleon</author><pubDate>Fri, 22 Jul 2022 18:02:15 +0800</pubDate><description><![CDATA[SPRING JDBC操作]]></description><category></category></item><item><title><![CDATA[Spring JDBC 【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/125391689</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/125391689</guid><author>milanleon</author><pubDate>Wed, 20 Jul 2022 16:13:34 +0800</pubDate><description><![CDATA[JAVA数据库操作]]></description><category></category></item><item><title><![CDATA[纤程（协程）]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/125806499</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/125806499</guid><author>milanleon</author><pubDate>Fri, 15 Jul 2022 16:02:38 +0800</pubDate><description><![CDATA[纤程、协程]]></description><category></category></item><item><title><![CDATA[Spring AOP【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/125187832</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/125187832</guid><author>milanleon</author><pubDate>Tue, 14 Jun 2022 09:34:46 +0800</pubDate><description><![CDATA[以下转载和参考自：装配AOP - 廖雪峰的官方网站。1、代理模式和AOP    前面说过Proxy代理模式，比如下面的Foo类中的func1和func2在执行前需要验证权限或者记录日志，那么实际上适合将这些动作提取到一个代理类中去。





    在Spring中，可以通过AOP（Aspect Oriented Programming），即面向切面编程来实现代码插入的功能。在AOP中，上面的Foo类中的func1、func2称为“核心逻辑”，权限验证、记录日志这些称为“切面逻辑”，AOP要实现的就是把切]]></description><category></category></item><item><title><![CDATA[Spring IoC (2)【转】]]></title><link>https://blog.youkuaiyun.com/milanleon/article/details/125070179</link><guid>https://blog.youkuaiyun.com/milanleon/article/details/125070179</guid><author>milanleon</author><pubDate>Tue, 07 Jun 2022 16:01:26 +0800</pubDate><description><![CDATA[1、第三方Bean

对于Java标准类或者第三方的类，我们无法给其加上@Component注解，如果想让其成为IoC管理的Bean的话，可以在@Configuration类中编写一个Java方法创建并返回它。如下给Test注入了标准类型ZoneID，可以看到Test中不需要setXXX()方法：


@Component
public class Test {
    @Autowired //注入标准类型
    private ZoneId zonid;
}

@Configuration
@Comp]]></description><category></category></item></channel></rss>