springBoot集成token认证,最全Java面试知识点梳理

简介: springBoot集成token认证,最全Java面试知识点梳理

com.auth0

java-jwt

3.3.0

com.alibaba

fastjson

1.2.47

cn.hutool

hutool-all

5.4.4

注意:我们默认是已经配置好mybatis的web项目,还未配置myBatis?点击此处

2.自定义两个注解


用来跳过验证的PassToken

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {
boolean required() default true;
}

需要登录才能进行操作的注解UserLoginToken

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {
boolean required() default true;
}

@Target:注解的作用目标

  • @Target(ElementType.TYPE)——接口、类、枚举、注解
  • @Target(ElementType.FIELD)——字段、枚举的常量
  • @Target(ElementType.METHOD)——方法
  • @Target(ElementType.PARAMETER)——方法参数
  • @Target(ElementType.CONSTRUCTOR) ——构造函数
  • @Target(ElementType.LOCAL_VARIABLE)——局部变量
  • @Target(ElementType.ANNOTATION_TYPE)——注解
  • @Target(ElementType.PACKAGE)——包

@Retention:注解的保留位置

  • RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
  • RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
  • RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。
  • @Document:说明该注解将被包含在javadoc中
  • @Inherited:说明子类可以继承父类中的该注解

3.简单自定义一个实体类User


public class User implements java.io.Serializable {
/** 版本号 */
private static final long serialVersionUID = 6111899065812654266L;
/** 主键自增Id */
private Integer userId;
/** 用户民 */
private String userName;
/** 用户密码 */
private String password;
/**
• 获取主键自增Id
• @return 主键自增Id
*/
public Integer getUserId() {
return this.userId;
}
/**
  • 设置主键自增Id

  • @param userId
主键自增Id
• 1
*/
public void setUserId(Integer userId) {
this.userId = userId;
}
/**
• 获取用户民
• @return 用户民
*/
public String getUserName() {
return this.userName;
}
/**
  • 设置用户民

  • @param userName
用户民
• 1
*/
public void setUserName(String userName) {
this.userName = userName;
}
/**
• 获取用户密码
• @return 用户密码
*/
public String getPassword() {
return this.password;
}
/**
  • 设置用户密码

  • @param password
用户密码
• 1
*/
public void setPassword(String password) {
this.password = password;
}
}

4.Mapper接口


public interface UserMapper {
public List getUserSelective(User user);
public User getUserByPrimary(Integer userId);
public User getUserByName(String userName);
}

5.service


UserService
public interface UserService {
/**
• 通过用户名获取唯一用户
• @param userName
• @return
*/
public User getUserByUserName(String userName);
/**
  • 根据条件获取用户
  • @param user
• @return
*/
public List getUserSelective(User user);
/**
• 通过主键获取用户
• @param userId
• @return
*/
public User getUserByUserId(Integer userId);
}

6.service的实现类


UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public User getUserByUserName(String userName) {
User user=userMapper.getUserByName(userName);
return user;
}
@Override
public List getUserSelective(User user) {
return userMapper.getUserSelective(user);
}
@Override
public User getUserByUserId(Integer userId) {
return userMapper.getUserByPrimary(userId);
}
}

7.UserMapper.xml


u.user_id, u.user_name, u.password
SELECT
FROM user u WHERE 1 = 1
AND u.user_name LIKE CONCAT(‘%’, #{userName}, ‘%’)
AND u.password =#{password}
SELECT FROM User as u WHERE u.user_id =#{userId}
SELECT FROM User as u WHERE u.user_name =#{userName}
limit 1

8.token的生成方法


TokenUtils
package com.personal.indentity.utils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
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.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
public class TokenUtils {
/**
• 签名秘钥
*/
private static final String SECRET = “zx12345678”;
/**
• 签发人
*/
private static final String issuer=“zhiyi”;
/**
• token过期时间,单位:min
*/
private static final Integer expireTime=2;
/**
• 从header中取token
• @return
*/
public static String getToken(){
HttpServletRequest request =WebUtils.getRequest();
String re=request.getHeader(“token”);
return re;
}
/**
• 创建token
• @param json 需要放入token的参数,多个参数可以封装成json或者map
• @return token
*/
public static String createToken(JSONObject json) {
try {
// 加密方式
Algorithm algorithm = Algorithm.HMAC256(SECRET);
return JWT.create()
.withSubject(json.toString())
.withIssuer(issuer)
// 设置过期时间为60分钟后
.withExpiresAt(DateUtil.offsetMinute(new Date(), expireTime))
.withClaim(“customString”, “zhiyi”)
.withArrayClaim(“customArray”, new Integer[]{1, 2, 3})
.sign(algorithm);
} catch (Exception exception) {
//Invalid Signing configuration / Couldn’t convert Claims.
System.out.println(exception.getMessage());
return null;
}
}
/**
• 校验token合法性
• @param token to verify.
*/
public static boolean verifyToken(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
JWTVerifier verifier = JWT.require(algorithm)
// 验证签发人是否相同
.withIssuer(issuer)
.build();
/*
• 校验:
• 格式校验:header.payload.signature
• 加密方式校验 Header中的alg
• 签名信息校验,防篡改
• 载体Payload 中公有声明字段校验
*/
verifier.verify(token);
return true;
} catch (Exception exception) {
//Invalid signature/claims
exception.printStackTrace();
return false;
}
}
/**
• 解析token
• @param token to decode.
*/
public static void decodeToken(String token) {
try {
DecodedJWT jwt = JWT.decode(token);
Map claims = jwt.getClaims();
Claim customStringClaim = claims.get(“customString”);
Claim customArrayClaim = claims.get(“customArray”);
String issuer = jwt.getIssuer();
String subject = jwt.getSubject();
System.out.println(customStringClaim.asString());
System.out.println(Arrays.toString(customArrayClaim.asArray(Integer.class)));
System.out.println(issuer);
System.out.println(JSONUtil.parseObj(subject).get(“userId”));
} catch (JWTDecodeException exception) {
//Invalid token
exception.printStackTrace();
}
}
public static String getUserIdByToken(String token){
DecodedJWT jwt = JWT.decode(token);
Map claims = jwt.getClaims();
String subject = jwt.getSubject();
String re=JSONUtil.parseObj(subject).get(“userId”).toString();
return re;
}
public static void main(String[] args) {
JSONObject subjectJson = new JSONObject();
subjectJson.put(“userId”, 1);
subjectJson.put(“name”, “ylc”);
String token = createToken(subjectJson);
System.out.println(“token:” + token);
System.out.println(“==============================================”);
//
// System.out.println(“1 min exp,now verify result:” + verifyToke(token));
// System.out.println(“==============================================”);
//
// System.out.println(“decode info:”);
// decodeToken(token);
// System.out.println(“================================================”);
// System.out.println(“1 min later,verify result:”+verifyToke(“eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjoxLFwibmFtZVwiOlwieWxjXCJ9IiwiaXNzIjoiemhpeWkiLCJleHAiOjE2MDIzMzI2OTMsImN1c3RvbUFycmF5IjpbMSwyLDNdLCJjdXN0b21TdHJpbmciOiJ6aGl5aSJ9.v6AQ2mba8gGsHFpJ52EY4fwoN03gEDsCUUSafpPscyQ”));
// System.out.println(“================================================”);
System.out.println(“userId:”+getUserIdByToken(“eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJ1c2VySWRcIjoxLFwibmFtZVwiOlwieWxjXCJ9IiwiaXNzIjoiemhpeWkiLCJleHAiOjE2MDIzMzM1MjEsImN1c3RvbUFycmF5IjpbMSwyLDNdLCJjdXN0b21TdHJpbmciOiJ6aGl5aSJ9.BKU-X6Bre9kCbsCtQgwDO6UE7znqbM84xy8dH6R7AiY”));
}
}
WebUtils
package com.dubbo.consumer.indentity.util;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class WebUtils {
/**
• 获取request
• @return
*/
public static HttpServletRequest getRequest() {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
return requestAttributes == null ? null : requestAttributes.getRequest();
}
/**
• 获取session
• @return
*/
public static HttpSession getSession() {
HttpSession session = getRequest().getSession();
return session;
}
}

Algorithm.HMAC256():使用HS256生成token,密钥则是用户的密码,唯一密钥的话可以保存在服务端。

withAudience()存入需要保存在token的信息,这里我把用户ID存入token中

9.拦截器

相关文章
|
3月前
|
Java Maven Windows
使用Java创建集成JACOB的HTTP服务
本文介绍了如何在Java中创建一个集成JACOB的HTTP服务,使Java应用能够调用Windows的COM组件。文章详细讲解了环境配置、动态加载JACOB DLL、创建HTTP服务器、实现IP白名单及处理HTTP请求的具体步骤,帮助读者实现Java应用与Windows系统的交互。作者拥有23年编程经验,文章来源于稀土掘金。著作权归作者所有,商业转载需授权。
使用Java创建集成JACOB的HTTP服务
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 设计模式 SQL
[Java]知识点
本文涵盖Java编程中的多个知识点,包括静态与动态代理、基本数据类型转换、设计模式、异常处理、类加载、序列化、ORM框架、IPv4地址分类、编译与解释等。文章详细介绍了每个知识点的原理和使用方法,并提供了相关示例和注意事项。
44 16
[Java]知识点
|
1月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
44 13
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
59 4
|
2月前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
95 1
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
92 2
|
2月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
202 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
2月前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
公司的app要上海外,涉及到推送功能,经过综合考虑,选择Google FCM进行消息推送。 查看一些集成博客和官方文档,看的似懂非懂,迷迷惑惑。本篇文章除了将我实际集成的经验分享出来,也会对看到的博客及其中产生的疑惑、注意事项一一评论。 从官方文档和众多博客中,你会发现Java集成FCM推送有多种实现方式,会让生产生文档很乱,不知作何选择的困惑。
107 0

热门文章

最新文章