有时候,我们在controller的方法中,会发现有一些方法都是在获取相同的参数,然后进行一些相同的操作,此时,我们就可以对这些操作进行处理
1.继承HandlerMethodArgumentResolver,UserArgumentResolver
package MiaoSha.config;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Service;
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 MiaoSha.domain.MiaoShaUser;
import MiaoSha.service.MiaoShaUserService;
import MiaoSha.service.UserService;
@Service
public class UserArgumentResolver implements HandlerMethodArgumentResolver{
@Autowired
MiaoShaUserService userService;
/**
* 对其他的不进行,只有在controller中加上
* MiaoShaUser user,才会进行处理,
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
Class<?> clazz=parameter.getParameterType();
return clazz==MiaoShaUser.class;
}
/**
* 因为每次都要去对电脑还是手机cookie做处理,这里继承HandlerMethodArgumentResolver
* 这里是进行处理的函数,返回数据到上面定义的MiaoShaUser user中
*/
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request=webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response =webRequest.getNativeResponse(HttpServletResponse.class);
String paramToken = request.getParameter(MiaoShaUserService.COOKIE_NAME_TOKEN);
String cookieToken = getCookieValue(request, MiaoShaUserService.COOKIE_NAME_TOKEN);
//如果两个都为空,则说明这个用户不是正常的用户
if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
return null;
}
String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
//根据token,去缓存中获取对应的数据,因为登录的时候根据token,把user放入缓存中
return userService.getByToken(response, token);
}
/**
*获取cookie的值
*/
private String getCookieValue(HttpServletRequest request, String cookiName) {
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies) {
if(cookie.getName().equals(cookiName)) {
return cookie.getValue();
}
}
return null;
}
}
2.将定义的参数转换器加入到拦截器中,进行判断什么时候要拦截处理
package MiaoSha.config;
import java.util.List;
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.WebMvcConfigurerAdapter;
/**
* 继承WebMvcConfigurerAdapter,可以实现自定义拦截器
* @author msi
*
*/
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{
@Autowired
UserArgumentResolver UserArgumentResolver;
/**
* 参数解析的方法,此时定义的参数拦截器加入到配置中
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(UserArgumentResolver);
}
}
3.具体实现
@RequestMapping("/to_list")
public String list(HttpServletResponse response,Model model,
MiaoShaUser user){
//在传参时获取cookie
model.addAttribute("user",user);
return "goods_list";
}
在handler找到list方法时,UserArgumentResolver的supportsParameter方法()会进行判断,参数中是否是MiaoShaUser user,如果是,再调用resolveArgument()方法,正常处理后返回user对象,上面的list的user参数中