Spring自定义参数解析器
结合redis编写User自定义参数解析器UserArgumentResolver
1 import javax.servlet.http.Cookie; 2 import javax.servlet.http.HttpServletRequest; 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.core.MethodParameter; 5 import org.springframework.stereotype.Service; 6 import org.springframework.web.bind.support.WebDataBinderFactory; 7 import org.springframework.web.context.request.NativeWebRequest; 8 import org.springframework.web.method.support.HandlerMethodArgumentResolver; 9 import org.springframework.web.method.support.ModelAndViewContainer; 10 import cn.xingaohbd.seckil.model.User; 11 import cn.xingaohbd.seckil.service.UserService; 12 13 @Service 14 public class UserArgumentResolver implements HandlerMethodArgumentResolver { 15 16 @Autowired 17 public UserService userService; 18 19 public String getParameterCokies(HttpServletRequest request,String tokenName){ 20 Cookie[] cookies = request.getCookies(); 21 for (Cookie ck : cookies) { 22 if(ck.getName().equals(tokenName)){ 23 return ck.getValue(); 24 } 25 } 26 return null; 27 } 28 29 @Override 30 public boolean supportsParameter(MethodParameter methodParameter) { 31 Class<?> p_class = methodParameter.getParameterType(); 32 return p_class == User.class; 33 } 34 35 @Override 36 public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, 37 NativeWebRequest nativeWebRequest, WebDataBinderFactory binderFactory) throws Exception { 38 HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class); 39 String requestParameter_token = request.getParameter("token"); 40 String cokies_token = getParameterCokies(request, "token"); 41 if(requestParameter_token == null && cokies_token == null){ 42 return null; 43 } 44 return userService.getUserFromRedisByToken(requestParameter_token != null ? requestParameter_token : cokies_token); 45 } 46 47 }
UserService
@Service @Transactional public class UserServiceImpl implements UserService { @Autowired private UserRedis userRedis; @Override public Object getUserFromRedisByToken(String token) { return userRedis.get(token); } }
在WebConfig中注册自定义参数解析器UserArgumentResolver
import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.util.ResourceUtils; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; @Configuration public class WebConfig extends WebMvcConfigurationSupport{ @Autowired UserArgumentResolver userArgumentResolver; @Override protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { argumentResolvers.add(userArgumentResolver); } public void addResourceHandlers(ResourceHandlerRegistry registry){ registry.addResourceHandler("/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/"); super.addResourceHandlers(registry); } }