收徒的网站源码分享(下载收徒)

今天给各位分享收徒的网站源码分享的知识,其中也会对下载收徒进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

一、背景

(1)需求来源

项目中,用户存在使用不同角色(用户中心的role)的uid进行登录,但当前系统只允许某种角色(role=XXX)的uid使用,在登录校验时就失败了

(2)方案确认

考虑到对未来存在各端的兼容性和扩展性,准备在Filter过滤器中做好uid转换,对上下游都兼容

(3)抽象迁移

可以理解为加密&解密过程,在前端传了加密参数,后端进行解密后继续正常请求

二、具体实现

(1)HttpServletRequest探索

可以发现HttpServletRequest有setAttribute、getAttribute、getParameter方法。顺手粗略学习了Request的Attribute和Parameter方法,Attribute为request范围内的属性信息,仅存在于Web容器内部,必须先有setAttribute,再getAttribute,均为Object类型;而parameter为页面提交的参数,会从Web客户端传到Web服务器端,也对上了只有getParameter而没有setParameter方法,且getParameter都是String类型(可以理解为json)Controller中@RequestParam注解获取参数本质是ServletRequest的getParameter/getParameterValues方法,因此还是得想办法做实现setParameter方法功能江湖中从来没缺过高手,所以多拜师就有答案了

(2)具体实现

通过看源码,先来看下ServletRequest、HttpServletRequest、ServletRequestWrapper和HttpServletRequestWrapper的类图关系

ServletRequest类图

典型的装饰者模式,定义MyRequestWrapper也作为具体装饰者,并重写getHeader、getHeaderNames、getHeaders、getParameter、getParameterValues、getParameterName等方法,我当前场景是需要修改Header中的uid,可以自行修改Parameter。MyRequestWrapper类定义如下:

publicclassMyRequestWrapperextendsHttpServletRequestWrapper{\npublicMyRequestWrapper(HttpServletRequestrequest){\nsuper(request);\n}\n\nprivateMap<String,String>headerMap=newHashMap<>();\n\npublicvoidaddHeader(Stringname,Stringvalue){\nheaderMap.put(name,value);\n}\n\n@Override\npublicStringgetHeader(Stringname){\nStringheaderValue=super.getHeader(name);\nif(headerMap.containsKey(name)){\nheaderValue=headerMap.get(name);\n}\nreturnheaderValue;\n}\n\n@Override\npublicEnumeration<String>getHeaderNames(){\nList<String>names=Collections.list(super.getHeaderNames());\nfor(Stringname:headerMap.keySet()){\nnames.add(name);\n}\nreturnCollections.enumeration(names);\n}\n\n@Override\npublicEnumeration<String>getHeaders(Stringname){\nList<String>values=Collections.list(super.getHeaders(name));\nif(headerMap.containsKey(name)){\nvalues=Arrays.asList(headerMap.get(name));\n}\nreturnCollections.enumeration(values);\n}\n}

使用该类变更Header值,如下:

HttpServletRequestservletRequest=(HttpServletRequest)request;\nStringpassportUid=servletRequest.getHeader(&34;);\n\n//something\n…\n//请求用户中心,拿到目标uid\nPassportUserResponsepassportUserResponse=passportServiceHttp.getUserUidByUidRole(q);\n//something\n…\n\nMyRequestWrappermyRequestWrapper=newMyRequestWrapper(servletRequest);\nmyRequestWrapper.addHeader(&34;,passportUserResponse.getUid().toString());\n\nSystem.out.pringln(myRequestWrapper.getHeader(&34;));

最后在所有controller里获取header里的uid,都是重新赋值的最新uid

三、总结

学习到不少知识点(HttpServletRequest的attribute和parameter区别、RequestParam注解、装饰者模式等等),共勉

关于收徒的网站源码分享,下载收徒的介绍到此结束,希望对大家有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平