前言
这一周开局不是很美好,折腾环境折腾了两天,好在最后都折腾好了,问题的根本不在于电脑,在于穷,自此下定决心,等自己工作挣钱了一定买一台好电脑。
后来就跟着教程继续跟进,感觉除了单元测试,其他的都还好吧,不过每天晚上听潘老师讲解一下单元测试,发现单元测试也不是那么难理解,看到装饰器模式这部分的介绍有点懵了就:
alphago前几年风靡全球,但你一定想不到的是:早上18世纪晚期的1770年,土耳其便已经拥有了一台自动下棋(应该是国际象棋)装置,比2016年3月alphago成名足足早了240年!该下棋装置在当时击败了大多数挑战者,这其中还包括了拿破仑。此装置不止能够计算出下一个落棋点,而且还可以自动拿着棋子下棋,甚至于还会与人交流说"将军"。
重点就在下棋装置里面的"人",实际上在下棋装置中偷偷藏了一个下棋的高手。而下棋装置走的每一步棋,都是由该下棋高手在内容操作的(当然这种操作本身使用机器装置传递到机器臂也很复杂)。但笔者想说的是:这种在下棋装置中将下棋高手包装(装饰)起来,以使得下棋傀儡拥有下棋高手的下棋能力的模式,被称为"装饰器模式"。
一开始就挺疑惑的,毕竟做出来的东西是人在操控,并且实现的就是人会的下棋功能,这不就是糊弄人吗,做它的意义是什么呢,直接让人下棋不更好吗,通过后来的代码,我才知道,所谓的“下棋傀儡”仅仅拥有下棋高手的功能,只是对下棋高手进行了装饰。
应用场景
token的问题解决后本节展示如何将新令牌添加到请求的header中。上节中学习过了使用
request.getHeader(String key);
来获取header中某个key的值。通常来说则还会有个类似的request.setHeader(String key, String value);
的方法用于设置header中的某个key的值。很遗憾,出于某些方面的考虑spring中(确认说是servlet)中并没有提供设置header的方法。
在这一节的功能是设置header中的某个key值。
下面用代码解释一下具体的作用:
class TokenFilterTest
{
/**在此传入auth-token的值*/
@Test
void doFilter(HttpServletRequest request)
{
String authToken = "654321";
this.getAuthUser(request);
}
/** 在此获取auth-token的值 */
void getAuthUser(HttpServletRequest request
{
// 获取auth-token
request.getHeader("auth-token");
// 获取当前登录用户header中的auth-token
}
}
此处的getHeader()方法为HttpServletRequest内置的方法,用于获取header中的某个key值,假如使用装饰器模式:
class TokenFilterTest {
...
}
/**
* HttpServletRequest傀儡
*/
/*继承自HttpServletRequest,那么该傀儡拥有HttpServletRequest 的所有方法*/
class RequestWrapper extends HttpServletRequest
{
/*必须装入一个真正的HttpServletRequest */
HttpServletRequest request;
private RequestWrapper()
{
}
/*必须装入一个真正的HttpServletRequest */
public RequestWrapper(HttpServletRequest request)
{
this.request = request;
}
@Override
/*拥有HttpServletRequest的getHeader()功能*/
String getHeader(String key)
{
/*实际完成getHeader()功能的是真正的HttpServletRequest */
return this.request.getHeader(key);
}
}
那么上面的方法就变成了这样:
class TokenFilterTest
{
/**在此传入auth-token的值*/
@Test
void doFilter(HttpServletRequest request)
{
String authToken = "654321";
RequestWrapper requestWrapper = new RequestWrapper(request);
this.getAuthUser(requestWrapper);
}
/** 在此获取auth-token的值 */
void getAuthUser(HttpServletRequest request
{
// 获取auth-token
request.getHeader("auth-token");
// 获取当前登录用户header中的auth-token
}
}
/**
* HttpServletRequest傀儡
*/
/*继承自HttpServletRequest,那么该傀儡拥有HttpServletRequest 的所有方法*/
class RequestWrapper extends HttpServletRequest
{
/*必须装入一个真正的HttpServletRequest */
HttpServletRequest request;
private RequestWrapper()
{
}
/*必须装入一个真正的HttpServletRequest */
public RequestWrapper(HttpServletRequest request)
{
this.request = request;
}
@Override
/*拥有HttpServletRequest的getHeader()功能*/
String getHeader(String key)
{
/*实际完成getHeader()功能的是真正的HttpServletRequest */
return this.request.getHeader(key);
}
}
那么这时候我便可以对header中的某个key值进行赋值操作:
/**
* Request傀儡
*/
class RequestWrapper extends HttpServletRequest {
...
@Override
String getHeader(String key) {
if ("auth-token".equals(key)) {
// 在此返回新的auth-token值
return "456789";
}
return this.request.getHeader(key);
}
}
要想返回特定的auth—token值,只需用某一变量进行传值即可,这里也就不做详细配置了。
总结
由于刚刚开始这部分的学习,不了解这样做对后面有什么影响,但是值得高兴的是,为以后类似问题的解决提供了新的思想,以后要学的还很多,这也许只是个开始吧。
最后呢,希望疫情早点过去,不希望再有坏消息了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。