软件工程日报04

继续练习,完成了登录及校验,完善个人信息等用户功能
其中相比之前在登陆功能上使用了jwt,目的是让用户在未登陆时无法访问界面。
导入依赖

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>4.4.0</version>
        </dependency>

创建工具类实现生成token和验证功能 其中key在创建与验证必须要相同

private static final String KEY = "free";
	
	//接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
                .withClaim("claims", claims)
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
                .sign(Algorithm.HMAC256(KEY));
    }

	//接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("claims")
                .asMap();
    }

在此基础上为了不在每一个业务层都调用jwt工具类,采用拦截器来实现便捷开发

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //令牌验证 获取token
        String token = request.getHeader("Authorization");

        try {
            Map<String,Object> claims = JwtUtil.parseToken(token);
            //把业务数据存储到ThreadLocal中
            ThreadLocalUtil.set(claims);
            //放行
            return true;
        } catch (Exception e){
            response.setStatus(401);
            //不放行
            return false;
        }
    }

定义配置类,添加到拦截器注册列表

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //登录和注册不拦截
        registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");
    }
}
posted @ 2025-03-06 20:30  Look_Back  阅读(15)  评论(0)    收藏  举报