前言
HashSet
其实实现很简单,也很取巧。
动态代理的缓存实现
最近想要自己写一个简单的http server
,因为之前的那个是epoll
的,只能运行在linux
平台上。
于是我便找到了平台通用的libevent
。
libevent
是事件驱动的,支持异步的网络框架。
十分值得学习。
去帮室友拿快递的时候看到的。
暑假没人打扫。
落了满地。
@PathVariable
在web后端框架中,路由设计是很重要的一步。
各个框架对接口设计的支持大多差不多,其中必然有
1 | @GET("/users/{id}/") |
这样的标准。
其中{id}
和:id
表示是一个不确定的值,这个随着rustful
的兴起也变得常用起来
比如我想要查看id = 1
的用户的信息,那么我的请求便是/users/1
如果查看id = 321
的用户信息,请求的便是/users/321
。
那么这个id便是一个不确定量。
于是对于这个方法而言这个id值便是参数,在我们调用时需要传进去。
在Spring MVC
中,完整的方法是这样
1 | @GetMapping("/employer/{phoneNumber}") |
所以这就要求我们在设计框架时还需要利用反射把请求的uri的特定路径值作为参数传进方法中。
正常我们进行反射调用时,像这样
1 | method().invoke(object(), paramters()); |
首先route
中需要有这个对应的Method
,其次对应的对象也应该在其中,然后是参数。
于是我设计为
1 | class Route { |
那么问题来了,对于不同的uri,我们应该怎么匹配路由呢。
我想到的是用正则
设计一个这样的Map
1 | Map<Pattern, Route> routeMap = new HashMap<>(); |
对于/users/{id}/
这样的字符串,我们需要产生一个pattern
出来。
1 | //根据参数进行正则替换 |
键为url
的Pattern
,那么在匹配时只要遍历一下
1 | //保存着所有的路由 |
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
我们在使用spring sec
的时候,一般会继承WebSecurityConfigurerAdapter
类
然后选择覆盖
protected void configure(AuthenticationManagerBuilder auth)
protected void configure(HttpSecurity http)
方法
1 | @Override |
一般而言登录的数据我们在protected void configure(AuthenticationManagerBuilder auth)
中,我们在studentService
中配置一个
1 | @Override |
方法就好。
但是遇到一个问题,这样的话用户名和密码都是定死的,我们拿不到form-data
数据,如果因为前端的问题,这种密码登录方式以外,我们还要稍微修改提交给我们的form-data
中的密码数据,做一下处理,自定义一个登录呢。
这个时候就需要用到AuthenticationProvider
了。
这是一个接口,提供了两种方法
1 | public interface AuthenticationProvider { |
通过第一个方法我们可以拿到form-data
的数据,并且返回一个UserDetails
如果登录成功的话,或者返回null
如果登录失败。
1 | @Override |
第二个方法是告诉spring sec
我们这个验证支持哪种验证。
这种验证属于Dao
验证。也就是DaoAuthenticationProvider
也就是UsernamePasswordAuthentication
。
所以在第二个方法中一般会这么写
1 | @Override |
下面就是注册要configure
方法中了
只要加入
1 | auth.authenticationProvider(new MyAuthenticationProvider()); |
就好了。。