spring boot:从零开始搭建一个项目 - day8 实现jwtToken验证

锻炼不就是为了吃更多好吃的吗 ——刚去完健身房然后开了包薯片=-=

spring boot:从零开始搭建一个项目 - day8 实现jwtToken验证


咳,书接上文,kisso虽然好用,奈何小程序不支持呀,咋整?启动原本心中的plan A:手写!

一、生成token

jwtToken介绍点这里
这里直接使用之前kisso的方法

// 生成 jwt 票据,访问请求头设置‘ accessToken=票据内容 ’
String jwtToken = SSOToken.create().setId(user.getId()).setIssuer(user.getNickName()).getToken();

不多比比,主要好处就是有现成的解码SSOToken ssoToken = SSOToken.parser(jwtToken);

二、重写拦截器

创建类extends HandlerInterceptorAdapter即可,继承此类重写preHandle()方法即可完成,当然要在WebMvcConfigurationSupport的子类中注册它。

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        //获取访问的方法
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
		//获取免登注解
        IgnoreLogin ignoreLogin = method.getAnnotation(IgnoreLogin.class);

        //忽略注解
        if(ignoreLogin != null){
    
    
            return true;
        }

        Result result = new Result();

        //从header中获取token
        String token = request.getHeader(GeneralAttributes.TOKEN_AUTH_VALIDATE);

        //验证token是否有效
        boolean flag = false;
        try {
    
    
            flag = iTokenService.checkToken(token);
        }catch (Exception e){
    
    
            response.setStatus(GeneralAttributes.RESULT_ERROR);
            logger.error(e.getMessage());
        }
        if (!flag){
    
    
            result.setCode(GeneralAttributes.TOKEN_TIMEOUT_ERROR);
            result.setMsg("token已过期");
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");

            response.getWriter().write(JSON.toJSONString(result));
            response.getWriter().flush();
            return false;
        }
        return true;
    }

看代码中的IgnoreLogin对象,是忽略登录注解,通过此注解可以跳过token验证阶段,一般用于登录等还未登录或不需要验证登录的接口。具体代码如下:

package com.dingx.personal.common.annontation;

import java.lang.annotation.*;

/**
 * 忽略Token验证
 * @author dingx
 * @date 2020年6月9日 22:25:41
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreLogin {
    
    

}

@Target:@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
@Retention:注解@Retention可以用来修饰注解,是注解的注解,称为元注解。
按生命周期来划分可分为3类:
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
@Documented:Documented注解表明这个注解是由 javadoc记录的,在默认情况下也有类似的记录工具。 如果一个类型声明被注解了文档化,它的注解成为公共API的一部分。

————————————————————————————————————————————
PS:最近略忙、略忙。以及实在没有什么前端天赋啊。。。前端写的太慢了qaq。。

猜你喜欢

转载自blog.csdn.net/qq_16253859/article/details/106390999