springmvc 下使用自定義註解獲取登入資訊
阿新 • • 發佈:2019-02-12
使用原因
大家的專案中在controller層是怎樣獲取登入使用者的資訊呢?
User loginUser=LoginUtil.getLoginUser();
- 1
- 2
我想有些同學是通過這樣獲得的,如果這樣實現的話,
恭喜你,你的Controller層已經喪失了單元測試的能力。
因為執行這個controller所需要的引數並沒有完全通過引數列表來獲得,而依賴於全域性環境(web環境)
這樣做使得springmvc為環境解耦所設計的整個架構變得毫無意義。
實現
那怎麼樣寫才算是高大上呢?先貼出最後效果
@RequestMapping(...) public 返回值 方法名(@logined User user){ }
- 1
- 2
- 3
- 4
相信大家一眼就能看出他的優點。下面說一下如何實現
自定義註解 @logined
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Logined {
}
- 1
- 2
- 3
- 4
- 5
實現HandlerMethodArgumentResolver介面
public class LoginedArgumentResolver implements HandlerMethodArgumentResolver{ /** * 檢查解析器是否支援解析該引數 */ @Override public boolean supportsParameter(MethodParameter parameter) { if( //如果該引數註解有@Logined parameter.getParameterAnnotation(Logined.class)!=null&& //如果該引數的型別為User parameter.getParameterType()==User.class ){ //支援解析該引數 return true; } return false; } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request= (HttpServletRequest) webRequest.getNativeRequest(); //這裡暫時把User物件放在session中 User user=(User)request.getSession().getAttribute("loginUser"); return user; } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
在springmvc的配置檔案中配置
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="org.apollo.springmvc.argResolver.LoginedArgumentResolver"></bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>
- 1
- 2
- 3
- 4
- 5
- 6