业务场景:
之前系统中页面上选择的站点默认的是全部的,现在要增加权限功能,只有用户有权限的站点才显示到页面上。为了最小限度的修改代码,决定用注解的方式对站点参数统一整理后再赋值
主要用到的是SpringMvc的HandlerMethodArgumentResolver接口和自定义注解类
1.创建自定义注解:
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface SiteAuthority {
}
2.实现HandlerMethodArgumentResolver接口
public class SiteAuthorityHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver{
@Autowired
AuthorityService authorityService;
@Value("${authorityControlSwitch}")
private String authorityControlSwitch;
/* (non-Javadoc)
* @see org.springframework.web.method.support.HandlerMethodArgumentResolver#supportsParameter(org.springframework.core.MethodParameter)
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
// TODO Auto-generated method stub
if (parameter.hasParameterAnnotation(SiteAuthority.class)) {
return true;
}
return false;
}
/* (non-Javadoc)
* @see org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument(org.springframework.core.MethodParameter, org.springframework.web.method.support.ModelAndViewContainer, org.springframework.web.context.request.NativeWebRequest, org.springframework.web.bind.support.WebDataBinderFactory)
*/
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 先获取系统中的所有站点
List<MtSite> allSiteList = MtSiteManager.getInstance().getSites();
//在判断权限控制开关,如果开启,则先获取有权限的站点,然后返回给参数
if(AuthorityControlSwitch.OPEN.getKey().equals(authorityControlSwitch)){
Map<String, MtSite> allSiteMap = new HashMap<String, MtSite>();
for (MtSite mtSite : allSiteList) {
allSiteMap.put(mtSite.getCode(), mtSite);
}
//HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
UurSessionEntity systemUser = (UurSessionEntity) SystemUserLoacl.getSystemUser();
List<String> sitCodeList= authorityService.getSiteCodeAuthorityByUser(systemUser.getUserName());
List<MtSite> authoritySites = new ArrayList<MtSite>();
for (String siteCode : sitCodeList) {
MtSite mtSite= allSiteMap.get(siteCode);
if (null != mtSite) {
authoritySites.add(mtSite);
}
}
return authoritySites;
}
return allSiteList;
}
}
3.再xml里进行配置
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.cas.platform.web.common.interceptor.SiteAuthorityHandlerMethodArgumentResolver"></bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>
4controller层对站点参数代码进行改造
改造之前:
public String showCalendarAnalysisPage(Model model) {
// 这种方式获取的全部站点,没有使用权限
List<MtSite> siteList = MtSiteManager.getInstance().getSites();
}
改造之后:
//把参数放在入参,同时加上自定义注解,通过SiteAuthorityHandlerMethodArgumentResolver 类,对所有站点数据进行处理,从而实现权限的增加
public String showCalendarAnalysisPage(Model model,@SiteAuthority List<MtSite> siteList){
}