
文章图片
第一步:pom文件引入jwt包
第二步:自定义两个注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 用于登录后才能操作
*/
@Target({ElementType.METHOD ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {
boolean required() default true;
import java.lang.annotation.*;
@Target(ElementType.PARAMETER)//Annotation所修饰的对象范围:方法参数
@Retention(RetentionPolicy.RUNTIME)//Annotation被保留时间:运行时保留(有效)
@Documented//标记注解
public @interface CurrentUser {
第三步:自定义拦截器
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.abby.controller.api.BaseController;
import com.abby.entity.User;
import com.abby.enums.ResultCode;
import com.abby.exceptions.APIException;
import com.abby.model.vo.LoginUser;
import com.abby.service.IUserService;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
public class AuthenticationInterceptor implements HandlerInterceptor {
@Autowired
private IUserService userService;
@Override
public boolean preHandle(HttpServletRequest httpServletRequest HttpServletResponse httpServletResponse Object object) throws Exception {
String token = httpServletRequest.getHeader(\"token\");// 从 http 请求头中取出 token
// 如果不是映射到方法直接通过
if(!(object instanceof HandlerMethod)){
return true;
HandlerMethod handlerMethod=(HandlerMethod)object;
Method method=handlerMethod.getMethod();
//检查有没有需要用户权限的注解
if (method.isAnnotationPresent(UserLoginToken.class)) {
UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
if (userLoginToken.required()) {
// 执行认证
if (token == null||StringUtils.isEmpty(token)) {
throw new APIException(ResultCode.AUTH.getCode()\"token is empty please login again\");
// 获取 token 中的 user id
Integer userId;
try {
String userIdStr = JWT.decode(token).getAudience().get(0);
userId = Integer.valueOf(userIdStr);
catch (JWTDecodeException j) {
throw new APIException(ResultCode.AUTH.getCode()ResultCode.AUTH.getMsg());
User user = userService.getById(userId);
if (user == null) {
throw new RuntimeException(\"用户不存在 , 请重新登录\");
// 验证 token
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
try {
jwtVerifier.verify(token);
catch (JWTVerificationException e) {
throw new APIException(ResultCode.AUTH.getCode()ResultCode.AUTH.getMsg());
LoginUser loginUser = new LoginUser();
loginUser.setUserId(user.getId());
loginUser.setUserName(user.getUserName());
httpServletRequest.setAttribute(\"currentUser\" loginUser);
return true;
return true;
@Override
public void postHandle(HttpServletRequest httpServletRequest HttpServletResponse httpServletResponse Object o ModelAndView modelAndView) throws Exception {
- 金字塔是远古文明的发电厂?可通过2种方式进行发电(上)
- Java|干翻小米,红米又出超大杯旗舰,120W+2K直屏+双旗舰芯
- 百度地图|Java程序员应知应会之Maven和Gradle的区别
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
- Java|Gamamobi CEO黄继德:我们的元宇宙游戏不担心体验落差
- Java|美国传来新消息,ASML态度也变了,这一切竟如此之快
- Java|李佳琦消失扯下阿里“遮羞布”,原来淘宝根本就没有护城河
- Java|我做公众号终于不亏钱了
- Java|微信转账时弹出“这行字”,别输付款密码,有人已经中招了
- Java|合肥恒泽冠雨讲坛:哪些方法能够快速输出抖音视频内容?
