04----------HandlerMethodArgumentResolver自定义参数转换器

有时候,我们在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参数中

猜你喜欢

转载自blog.csdn.net/qq_33296156/article/details/82085258
今日推荐