一.先声明注解类
package com.wfy.controller;
import java.lang.annotation.*;
/**
* Created with IntelliJ IDEA.
* Description:
*
* @author 王飞焱
* Date: 11:29
* Time: 2018/8/10
*/
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrUsers {
String value() default "users";
}
1.@Target指定注解的使用范围,这里我们指定ElementType为PARAMETER,也就是参数即可。
2.@Retention作用是定义该注解能保留多久,一共有三种策略,这里我们指定为RUNTIME,也就是运行时
3.创建@CurrUser的解析器类,该类实现spring的HandleMethodArgumentResolver
二.实现HandlerMethodArgumentResolver接口
利用自定义注解类中的default(key)值 获取session作用域中的value值
package com.wfy.util;
import com.wfy.controller.CurrUsers;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
/**
* 实现@currUser的参数解析器
* Created by caidapao on 2018/3/30
* Time 22:02
*/
public class CurrUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
if(methodParameter.hasParameterAnnotation(CurrUsers.class)){
return true;
}
return false;
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
CurrUsers currentUserAnnotation = methodParameter.getParameterAnnotation(CurrUsers.class);
return nativeWebRequest.getAttribute(currentUserAnnotation.value(), NativeWebRequest.SCOPE_SESSION);
}
}
1.supportsParameter方法,判断什么时候要执行下面的resolveArgument方法。这里我们判断当一个方法的参数含有@CurrUser的时候返回true。
2.resolveArgument方法,在这里我们直接把放在session中的用户信息放回去即可。
三.配置SpringMVC.xml
<!-- 交给spring统一管理-->
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="com.wfy.util.CurrUserMethodArgumentResolver"/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
四.测试是否配置成功
@RequestMapping(value = "/insertUser")
@ResponseBody
public ResultMessage insertUserinfo(HttpServletRequest request, UsersInfo users) {
ResultMessage message = usersInfoService.insertUserinfo(users);
request.getSession().setAttribute("users",users);
return message;
}
@RequestMapping(value = "/testUsers")
@ResponseBody
public String testUsers(@CurrUsers UsersInfo currUsersUtil) {
log.info("进入测试方法");
log.info("用户名"+currUsersUtil.getUserName());
log.info("密码"+currUsersUtil.getUserPassword());
return currUsersUtil.getUserName();
}
1.第一个方法添加用户并保存用户信息到session
2.第二个方法用自定义注解获取session里的信息
注:@CurrUsers 这个就是自定义的注解
UsersInfo currUsersUtil 是你要映射的实体类,保存在session里的数据映射到你声明的实体
测试效果
先调用 insertUser 保存session
再调用testUsers 用注解获取
打印用户信息如下