这一周开局不是很美好,折腾环境折腾了两天,好在最后都折腾好了,问题的根本不在于电脑,在于穷,自此下定决心,等本身工做挣钱了必定买一台好电脑。
后来就跟着教程继续跟进,感受除了单元测试,其余的都还好吧,不过天天晚上听潘老师讲解一下单元测试,发现单元测试也不是那么难理解,看到装饰器模式这部分的介绍有点懵了就:spring
alphago前几年风靡全球,但你必定想不到的是:早上18世纪晚期的1770年,土耳其便已经拥有了一台自动下棋(应该是国际象棋)装置,比2016年3月alphago成名足足早了240年!该下棋装置在当时击败了大多数挑战者,这其中还包括了拿破仑。此装置不止可以计算出下一个落棋点,并且还能够自动拿着棋子下棋,甚至于还会与人交流说"将军"。
重点就在下棋装置里面的"人",实际上在下棋装置中偷偷藏了一个下棋的高手。而下棋装置走的每一步棋,都是由该下棋高手在内容操做的(固然这种操做自己使用机器装置传递到机器臂也很复杂)。但笔者想说的是:这种在下棋装置中将下棋高手包装(装饰)起来,以使得下棋傀儡拥有下棋高手的下棋能力的模式,被称为"装饰器模式"。app
一开始就挺疑惑的,毕竟作出来的东西是人在操控,而且实现的就是人会的下棋功能,这不就是糊弄人吗,作它的意义是什么呢,直接让人下棋不更好吗,经过后来的代码,我才知道,所谓的“下棋傀儡”仅仅拥有下棋高手的功能,只是对下棋高手进行了装饰。ide
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值,假如使用装饰器模式:this
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); } }
那么上面的方法就变成了这样:spa
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值进行赋值操做:code
/** * 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值,只需用某一变量进行传值便可,这里也就不作详细配置了。blog
因为刚刚开始这部分的学习,不了解这样作对后面有什么影响,可是值得高兴的是,为之后相似问题的解决提供了新的思想,之后要学的还不少,这也许只是个开始吧。最后呢,但愿疫情早点过去,不但愿再有坏消息了。