引言
用过springsecurity的人应该知道,在控制器方法中的参数principal 在请求的时候没有传递,却有用户的信息,跟其他用户传递了的参数又是如何封装到参数中,对象的呢,就是我们今天要解决的的问题
原因
这是由于springmvc 对我们所传递的参数进行了处理,处理成我们控制器方法中我们想要的参数
从springmvc3.1增加的HandlerMethodArgumentResolver接口,意思为策略接口解决方法参数代入参数值在给定请求的上下文。
也就是处理方法参数的一个解析器,如果了解springmvc请求过程的应该知道。
使用
如果我们要实现一个自定义的参数注入
1.写一个自定义注解
import java.lang.annotation.*;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserBasic {
}
2.写一个类实现HandlerMethodArgumentResolver
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
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;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@Component
public class UserBasicArgumentResolver implements HandlerMethodArgumentResolver {
// 我们的数据库查询服务
@Resource
private UserCustomService userCustomService;
@Override
public boolean supportsParameter(MethodParameter parameter) {
// 判断参数上的注解是不是等于UserBasic
return parameter.hasParameterAnnotation(UserBasic.class);
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
if (request != null) {
// 获取用户id
String userId = request.getParameter("userId");
// 数据库查询用户信息或者处理我们其他的业务逻辑
return userCustomService.getUser(userId);
}
return null;
}
}
3. 在web配置类注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport {
@Autowired
private UserBasicArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
4.控制器方法为
@RequestMapping(value = "delete", method = RequestMethod.GET)
@ResponseBody
public ResultBean delete(@UserBasic UserBasicVo userBasicVo) {
return hotelService.deleteByUserId( userBasicVo.getSysCode());
}