SpringBoot拦截器中获取token中的用户信息并通过注解可以在任何一个Controller上获取到用户基本信息

首先创建一个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);
    }

}
  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以通过实现 Filter 接口来创建一个过滤,然后在 Spring Boot 使用 @Bean 注解将其注册到应用程序。在过滤,可以通过 HttpServletRequest 对象获取请求头token,然后进行验证或者其他操作。具体实现可以参考 Spring Boot 官方文档或者相关教程。 ### 回答2: 在使用Spring Boot,可以通过创建一个过滤拦截token。下面是一个简单的示例,说明如何实现。 首先,需要创建一个自定义的过滤类,实现javax.servlet.Filter接口。在实现过滤时,我们可以在doFilter方法进行token验证的逻辑处理。以下是示例代码: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class TokenFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 将请求和响应对象转换成HttpServletRequest和HttpServletResponse对象 HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 从请求头获取token String token = httpRequest.getHeader("Authorization"); // 进行token验证的逻辑处理,例如验证token是否过期、是否有效等 // ... // 如果验证通过,将请求继续传递给下一个过滤或目标资源处理 chain.doFilter(request, response); } // 其他方法,例如init和destroy方法,可以留空不做处理 } ``` 接下来,需要将自定义的过滤添加到Spring Boot应用程序。可以使用@Configuration注解将过滤添加为一个Bean,并使用@Order注解指定过滤的执行顺序。例如: ```java import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<TokenFilter> tokenFilter() { FilterRegistrationBean<TokenFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new TokenFilter()); // 设置过滤的URL映射规则,例如/*表示拦截所有请求 registrationBean.addUrlPatterns("/*"); // 设置过滤的执行顺序 registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; } } ``` 最后,重新启动Spring Boot应用程序,自定义的过滤就会拦截所有请求,并对token进行验证处理。 请注意,上述示例只是一个简单的演示,实际应用可能需要根据具体的需求进行修改和扩展。例如,可以从数据库或缓存获取token,进行更加复杂的验证逻辑,并在验证失败时返回相应的错误信息。 ### 回答3: 使用Spring Boot实现过滤拦截Token的步骤如下: 1. 创建一个自定义的过滤类,实现javax.servlet.Filter接口,并重写doFilter方法。在doFilter方法,可以通过HttpServletRequest对象获取请求头Token信息,并进行相应的验证或处理。 2. 在Spring Boot应用的启动类,通过添加注解@EnableWebSecurity开启Web安全配置,并通过继承WebSecurityConfigurerAdapter类重写configure方法。 3. 在configure方法,使用http对象的addFilterBefore方法将自定义的过滤添加到过滤,指定过滤在哪个过滤之前进行拦截。 4. 在过滤,可以进行Token的验证和处理逻辑。例如,可以使用JWT来生成和验证Token,或将Token存储在Redis,根据请求的Token进行校验等。 5. 如果Token验证不通过,可以返回相应的错误信息或重定向到登录页面。如果验证通过,可以进行其他的业务逻辑处理。 总之,通过自定义过滤并将其添加到Spring Boot的过滤,可以在请求到达Controller之前进行Token的验证和拦截操作,以实现对请求的安全控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值