场景: springmvc 的请求入参可以用@RequestParam 、@ModelAttribute等来自动获取,但现在有个需求去根据请求参数里的token去获取自定义的Session,然后可以绑定到方法的参数上,而不需要用静态方法去自己获取。
修改前:
@RequestMapping()
public String test(@RequestParam(requeired = false) String token)
{
/*意味着每个需要session的地方都需要自己手动获取*/
Session session =SessionUtil.getSession(token);
}
修改后:
@RequestMapping()
public String test(@ModelAttribute("session")Session session)
{
/*这里可以直接调用*/
session.doSomeThing();
}
具体方法有三个(我目前所能找到的):
1.
@ModelAttribute
public void getSession(HttpServletRequest request,Model model)
{
String token = request.getParameter(GlobalStatic.token_name);
if (Strings.isNullOrEmpty(token))
{
model.addAttribute("session", null);
}
else
{
System.out.println((String)token);
model.addAttribute("session",
sessionFactory.getSession(token));
}
}
这个bind方法可以放在父类Controller里面,你可以根据需求处理没有token的情况。还有就是这个方法还有一些变化,可以参照:
http://blog.youkuaiyun.com/li_xiao_ming/article/details/8349115
2.
<mvc:annotation-driven >
修改request过来的参数,可以实现类似于往parameter里添加参数的功能
<mvc:argument-resolvers>
<bean class="TokenHandler"></bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>
这里可以配置paramHandler来处理入参,具体代码如下:
public class TokenHandler implements WebArgumentResolver {
@Override
public Object resolveArgument(MethodParameter methodParameter,NativeWebRequest webRequest) throws Exception {
if (methodParameter.getParameterName().equals("token"))
{
return new Session();
}
return null;
}
}
3.使用HttpServletRequestWrapper来包装request,然后在filter的chain.dofilter里包装下。