posthandle 获取controller的返回值_震惊!你绝对想不到Spring可以这样获取请求入参出参...

过滤器在非侵入型的情况下获取请求信息,想必你肯定会想到过滤器。过滤器有可以得到两个信息,HttpServletRequest与HttpServletResponse,你肯定会觉得我用这个两个对象就可以获取想要的信息。那我们就来试试获取对应的信息吧 1c7ccdfc67e91b01ce36acf0fbc188ce.gif 86d4677f93fe6476453bbadbe72555f3.png你说说spring中怎么获取请求入参获取所有的入参调用request.getParameterMap(),这样简单的得到了请求的所有参数 6b99944db59de0352710afe2a252ea2e.png 86d4677f93fe6476453bbadbe72555f3.png那如果是json或者xml这类的请求类型的话你该怎么办哦,这个好办啊,获取请求的数据流就好了。request.getInputStream()然后转换文本得到。 6b99944db59de0352710afe2a252ea2e.png 86d4677f93fe6476453bbadbe72555f3.png你去试试吧哪里不对吗?我这就去测试 6b99944db59de0352710afe2a252ea2e.png b67a617803dc2db7a66406cc2c620450.png 86d4677f93fe6476453bbadbe72555f3.png还没试出来?唉,单纯拿输入流是不够,需要装饰一下才行,不然过滤器调用了request.getInputStream()那业务代码里面就报错了,提示流已经关闭. 6b99944db59de0352710afe2a252ea2e.png自定义HttpServletRequest1.编写一个类输入流继承ServletInputStream的类:

ffc6009a8fd6d51be2717116ce1bdbe0.png

2.编写一个自定义的Request继承HttpServletRequestWrapper:

fcd158e0522433cccf775d497d6f7945.png

3.大功告成94749c03f837b4595674c9c4fa25fd45.png

8a4f18a784c0cfc8ce1ed771453832b1.gif 76bdd0fbe2353107ed0c660806a6406d.png 86d4677f93fe6476453bbadbe72555f3.png哎哟!还有两下子那是那是,跟经理比起来还差得狠嘞 6b99944db59de0352710afe2a252ea2e.png 86d4677f93fe6476453bbadbe72555f3.png还有出参呢?出参你还没说出参,我看看哈 6b99944db59de0352710afe2a252ea2e.png   b67a617803dc2db7a66406cc2c620450.png 86d4677f93fe6476453bbadbe72555f3.png时间过去好久了,想出来了没HttpServletResponse好像只有写入的方法没有获取方法来着 6b99944db59de0352710afe2a252ea2e.png 86d4677f93fe6476453bbadbe72555f3.png那你怎么做唉,想了好久,只能跟request的方式差不多,装饰一下,然后用户调用写入方法的时候记录起来 6b99944db59de0352710afe2a252ea2e.png自定义HttpServletRequest1.编写一个类输出流继承ServletOutputStream的类:

c6ec9b8d636e46499e34c2da8caee70a.png

2.编写一个自定义的Response继承HttpServletResponseWrapper:

3cb49ec1ee1fd637a8812cc21088eeee.png

3.大功告

cec1a7453b171017ec5b4e4602c0e844.png

1c7ccdfc67e91b01ce36acf0fbc188ce.gif 86d4677f93fe6476453bbadbe72555f3.png?,小伙子脑回路挺不错呀唉,第一次遇到这样子的需求 6b99944db59de0352710afe2a252ea2e.png 86d4677f93fe6476453bbadbe72555f3.png但是spring项目基本就controller了,拦截捕获方法入参与返回值不是更简单嘛哎哟,你说的这么简单,你这考我我难受呢,那你都说拦截器了,那肯定就AOP获取方法入参与返回值 6b99944db59de0352710afe2a252ea2e.pngAOP方式 4ad263baa9694634de80179bc397793e.png 1c7ccdfc67e91b01ce36acf0fbc188ce.gif 86d4677f93fe6476453bbadbe72555f3.png写的挺快的呀,但是你这样入参没有参数名的,需要参数名的什么鬼,AOP获取参数名有点难来着 6b99944db59de0352710afe2a252ea2e.png 86d4677f93fe6476453bbadbe72555f3.png那你想想spring怎么获取的呢,好好想想吧唔,那个好像是高级反射来着 6b99944db59de0352710afe2a252ea2e.png

65c28c9ea93968f1f0e330324f134e02.png

断点跟踪下源码

1.首先写一个测试类

e039ff8d6b917cd1ec41bf870ece798b.png

2.断点一下

b50e68c57895f9a8a5a7716abc655a46.png

3.从这里可以看到入参是从getMethodArgumentValues获取的,那么我们看下这个源码吧

5e8636db386dd3493239592457ed6407.png

4.方法参数从MethodParameter对象获取,我们来看看这个类

611321067a279f28f70d4279918678b7.png

5.这里有参数名,我来重新断点一下,看下这个参数名是不是想要的

a645d26b0b36429032dcac7b3f47d664.png

6.赞,这个就是想要的参数名,然后this.resolvers.resolveArgument是获取参数值的,那我们来看看resolvers在哪里进行赋值的

7b2153873e14a82dbb36b894b27ddbde.png

这里

809182834bafbc8f2b330dd463dc8d7a.png

功夫不负有心人

看下哪里调用这个方法

0231903b3bd5c543b72790202a057119.png

进去看看

caebfca668cd907a93e86e10b37ac878.png

8de6d2eb1ae11700d33676d5bb32381d.png

出参入参的对象处理器设置都在这。来看下这个类的来历

5fc755680f48fe7bfb43704bd3a8bca6.png

大概的解释就是

支持自定义参数和返回值类型可以通过添加
* {@link #setCustomReturnValueHandlers}和{@link #setCustomReturnValueHandlers},
*或者,重新配置所有参数和返回值类型,
*使用{@link #setArgumentResolvers}和{@link #setReturnValueHandlers}

b9729b662c9a3c7f363ea6c457a0689b.png

564148e323b89f842a3438edd72afc99.png

编写自定义MethodArgumentResolver 6de1abb543b0c1a8ff59b47928959286.png编写自定义HandlerMethodReturnValueHandler 510011a81a76a89885abebe3fe1e1a10.png加入出参入参处理器 68f45c8978e304272c061642f8cb2c0c.png

33e02c3f69bf0bbb7cdea52da0f31f9f.png

1c7ccdfc67e91b01ce36acf0fbc188ce.gif打印效果

44fe6432cbf7eeca1d94ecc812185b27.png

0311b9b26aaa21e7d8e2ef6e7c662d0b.png

终于找到了两个类:

1.获取入参HandlerMethodArgumentResolver

2.获取出参HandlerMethodReturnValueHandler

6b99944db59de0352710afe2a252ea2e.png 86d4677f93fe6476453bbadbe72555f3.png哇,这你都能找到,跟我讲讲呗嘻嘻,这就来 6b99944db59de0352710afe2a252ea2e.pngEND 5356243f1d46a068ba2dfd0912f67d00.png
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
拦截器类 需要两个配合使用这里只有一个 @Configuration public class ServletContextConfig extends WebMvcConfigurerAdapter { public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/"); super.addResourceHandlers(registry); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerMyInterceptorAdapter()).addPathPatterns("/**") .excludePathPatterns("/") // .excludePathPatterns("/expressions/getExpressionsList") .excludePathPatterns("/loginInfo/getCordByIsPhone") .excludePathPatterns("/loginInfo/login11") //token失效跳轉 .excludePathPatterns("/loginInfo/insertLoginInfo") //注册 .excludePathPatterns("/loginInfo/login") //登录 .excludePathPatterns("/upload") //上传文件 .excludePathPatterns("/uploadListen") //上传文件 .excludePathPatterns("/admin/user/goLogin") //后台跳转登录 .excludePathPatterns("/admin/user/login") //后台登录 .excludePathPatterns("/loginInfo/getLoginInfo") //忘记密码 .excludePathPatterns("/loginInfo/getCord") //短信验证码 .excludePathPatterns("/loginInfo/getIsLoginInfo") //判断验证码&&登录 .excludePathPatterns("/loginInfo/getIsLoginInfo1") //判断验证码 .excludePathPatterns("/loginInfo/setPassWord") //设置密码 ; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } @Component public class HandlerMyInterceptorAdapter implements HandlerInterceptor { @Autowired private HeartbeatServiceImpl heartbeatService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { String url = request.getRequestURI(); if (url.contains("admin")) { User user = (User) request.getSession().getAttribute("user"); try { if (user.equals(null)) { response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } else { return true; } }catch (Exception e){ response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } }else { String token = request.getHeader("token"); if (token != null) { Jedis jedis = new Jedis(com.sevenSteps.util.RedisConfig.HOST, RedisConfig.PORT); String s = jedis.get(token); if(token.equals(s)) { heartbeatService = SpringUtil.getBean(HeartbeatServiceImpl.class); return heartbeatService.setOutDate(token); }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值