微信开发如何优雅的注入token(2)
来源:互联网 发布:人工智能产业政策 编辑:程序博客网 时间:2024/06/05 08:36
上文介绍了切面的方法注入token,注意这里参数声明的是token类,用String声明token,切面的before方法无法捕捉(不知为何),这里继续前文,通过增加修改参数绑定类来实现。
Controller的参数绑定于HandlerMethodArgumentResolver负责绑定,我们只需要增加一个处理类,即可处理我们自己定义的参数。首先增加一个处理类
<mvc:annotation-driven><mvc:argument-resolvers><bean class="com.hendiaome.test.resolver.TokenResolver"></bean></mvc:argument-resolvers></mvc:annotation-driven>
需要知道resolve是一个集合,处理时调用集合的resolve类来进行参数的支持与否和绑定就ok了。
处理类
public class TokenResolver implements HandlerMethodArgumentResolver{ @Override public boolean supportsParameter(MethodParameter parameter) { //此次直接用string接受token String tokenClass = parameter.getParameterType().getName(); //参数的名字就是token String tokenParamName = parameter.getParameterName(); if (String.class.getName().equals(tokenClass) && "token".equals(tokenParamName)) { return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { //后续为释放token做准备,只释放参数声明的controller方法 Token.threadLocal.set(true); return Token.getTokenAndLock(); }}
controller类更加简单
@RequestMapping("/test") @ResponseBody public String test(String token) { System.out.println(token); //拿着token去做自己的业务处理去吧 return "OK"; }
这样token的获取加锁就完成了,头疼的问题是什么是否释放并解锁,不想再用切面了,想想spring mvc的原理,从dispatcher入手,再分配完处理完请求后执行我们的释放方法。
首先在web.xml中声明我们的类,不适用spring mvc默认的类
<servlet> <description>spring mvc servlet</description> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>com.hendiaome.test.resolver.TokenDispatcher</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:config/spring-mvc.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
public class TokenDispatcher extends DispatcherServlet { @Override protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { try { //执行父类的分配方法 super.doDispatch(request, response); } catch (Exception e) { throw e; } finally { //完毕后释放我们的锁 if (Token.threadLocal.get()) { Token.releaseTokenAndUnlock(); } } }}这样就完成了,感觉还是这种方法好一点,第一篇有一个缺陷(未解决)。
参考文献http://blog.csdn.net/joeyon1985/article/details/49904681
阅读全文
0 0
- 微信开发如何优雅的注入token(2)
- 微信开发如何优雅的注入token
- 微信开发-Token处理
- java 微信开发token验证失败的一种情况
- 微信开发token验证失败怎么办的解决办法
- java微信开发的服务器(令牌)token
- 微信公众号开发 Token和凭证Access Token
- 微信公众平台开发 ACCESS TOKEN
- 微信公众平台开发 ACCESS TOKEN
- 微信公众平台开发 ACCESS TOKEN
- 微信公众号开发Access Token
- nodejs微信开发--验证路径token
- java微信开发-token验证
- 微信开发,通过token获取signature
- 微信开发定时器更新token
- java微信开发-token验证
- 微信开发配置token失败
- java微信开发-token验证
- 如何判断一个字符串是不是回文字符串以及字符串的排列组合问题
- 20170821-20170827
- QTreeWidget编辑某项时如何得到编辑框内容如何知道编辑完成
- CTEX中文编辑问题
- 高斯模糊解释
- 微信开发如何优雅的注入token(2)
- 算法导论之红黑树
- Bootstrap3.0学习第十轮(下拉菜单、按钮组、按钮式下拉菜单)
- 使用SpringEMail API发送Email
- JVM内存设置后TOMCAT无法启动:
- Linux应用程序地址分布
- springBoot(五)整合之C3P0_Junit
- Java NIO系列教程(2):Channel
- Keytool命令详解