首先创建一个CurrentUserMethodArgumentResolver类并实现HandlerMethodArgumentResolver 接口。
CurrentUserInfo.class 是封装的一个用户信息类,根据境况添加想获取的信息
CurrentUser.class是一个注解类,通过此注解可以获取当前用户的信息
package zut.edu.interceptor;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.multipart.support.MissingServletRequestPartException;
import zut.edu.annotation.CurrentUser;
import zut.edu.dto.CurrentUserInfo;
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterType().isAssignableFrom(CurrentUserInfo.class)
&& methodParameter.hasParameterAnnotation(CurrentUser.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
// 获取拦截器中获取的当前用户信息
CurrentUserInfo currentUserInfo = (CurrentUserInfo)nativeWebRequest.getAttribute("currentUserInfo", RequestAttributes.SCOPE_REQUEST);
if (currentUserInfo != null){
return currentUserInfo;
}
// 如果当前用户信息为null 则抛出异常
throw new MissingServletRequestPartException("currentUserInfo");
}
}
CurrentUser.class如下
package zut.edu.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 在Controller的方法参数使用此注解,该方法在映射时会注入当前登录的User对象
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
拦截器代码如下
package zut.edu.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import zut.edu.dto.CurrentUserInfo;
import zut.edu.service.UsersService;
import zut.edu.utils.JwtUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @date 2021/2/1 17:26
*/
@Slf4j
public class JwtAuthenticationInterceptor implements HandlerInterceptor {
// 注入操作用户表的服务层
@Autowired
private UsersService usersService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// springboot跨域请求 放行OPTIONS请求
if(request.getMethod().toUpperCase().equals("OPTIONS")){
return true;//通过所有OPTION请求
}
// 获取请求头中的Token 参数要跟前端的设置一样
String token = request.getHeader("X-Token");
if(token == null){
return false;
}
if(!JwtUtil.verifyToken(token)){
return false;
}
// 获取token中的用户的id
String userId = JwtUtil.parseToken(token);
//log.info("查看token中的用户id:" + userId);
// 获取当前操作用户信息
CurrentUserInfo currentUserInfo = usersService.getCurrentUserInfo(userId);
// 为CurrentUserMethodArgumentResolver中的currentUserInfo设置用户信息
request.setAttribute("currentUserInfo", currentUserInfo);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
CurrentUserMethodArgumentResolver添加到拦截器中
package zut.edu.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import zut.edu.interceptor.CurrentUserMethodArgumentResolver;
import zut.edu.interceptor.JwtAuthenticationInterceptor;
import java.util.List;
/**
* @version 1.0
* @date 2021/2/1 17:35
*/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Bean
public JwtAuthenticationInterceptor setBean(){
return new JwtAuthenticationInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(setBean()).addPathPatterns("/**").excludePathPatterns("/users/userlogin");
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentUserMethodArgumentResolver());
}
@Bean
public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
return new CurrentUserMethodArgumentResolver();
}
}
测试案例
@CurrentUser CurrentUserInfo currentUserInfo会把用户信息注入到变量currentUserInfo中
package zut.edu.controller;
import com.power.common.model.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import zut.edu.annotation.CurrentUser;
import zut.edu.dto.CurrentUserInfo;
import zut.edu.dto.DataExtractionDto;
import zut.edu.dto.UserDto;
import zut.edu.entity.DataExtraction;
import zut.edu.service.DataExtractionService;
import zut.edu.vo.Message;
import zut.edu.vo.ResultCode;
import javax.annotation.Resource;
/**
* 数据抽取表(Dataextraction)表控制层
*
* @since 2021-02-20 12:41:22
*/
@Slf4j
@RestController
@RequestMapping("dataExtraction")
public class DataExtractionController {
/**
* 服务对象
*/
@Resource
private DataExtractionService dataExtractionService;
@PostMapping(value = "exec")
public CommonResult<Object> sqoopTask(@RequestBody DataExtractionDto dataExtractionDto, @CurrentUser CurrentUserInfo currentUserInfo) {
log.info("查看获取的参数" + dataExtractionDto);
int result = dataExtractionService.sqoopTask(dataExtractionDto, currentUserInfo);
log.info("查看返回的值" + result);
return CommonResult.ok(new Message("提交成功", ResultCode.SUCCESS.getCode())).setResult(result);
}
}