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
    

*/

public void setUserId(Integer userId) {

this.userId = userId;

}

/**

  • 获取用户民

  • @return 用户民

*/

public String getUserName() {

return this.userName;

}

/**

  • 设置用户民

  • @param userName

  •      用户民
    

*/

public void setUserName(String userName) {

this.userName = userName;

}

/**

  • 获取用户密码

  • @return 用户密码

*/

public String getPassword() {

return this.password;

}

/**

  • 设置用户密码

  • @param password

  •      用户密码
    

*/

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


<?xml version="1.0" encoding="UTF-8" ?>

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<String, Claim> 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<String, Claim> 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.拦截器


小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

token,密钥则是用户的密码,唯一密钥的话可以保存在服务端。

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

9.拦截器


小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-8jmIWV52-1711006892497)]
[外链图片转存中…(img-PG90wOVD-1711006892498)]
[外链图片转存中…(img-1zIY8ce1-1711006892498)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-6nj7lZpH-1711006892498)]

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

[外链图片转存中…(img-4X4CGwmf-1711006892499)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 SpringBoot 集成 tokenJava 代码示例: ``` @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Autowired private JwtAuthenticationEntryPoint unauthorizedHandler; @Bean public JwtAuthenticationFilter authenticationTokenFilterBean() throws Exception { return new JwtAuthenticationFilter(); } @Override public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { authenticationManagerBuilder .userDetailsService(userDetailsService) .passwordEncoder(passwordEncoder()); } @Bean(BeanIds.AUTHENTICATION_MANAGER) @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { http .cors() .and() .csrf() .disable() .exceptionHandling() .authenticationEntryPoint(unauthorizedHandler) .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers("/api/auth/**") .permitAll() .anyRequest() .authenticated(); // 添加 JWT filter http.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class); } } ``` 这段代码使用了 Spring Security 和 JWT 实现了 token 认证。其中,`JwtAuthenticationFilter` 是一个自定义的过滤器,用于解析和验证 JWT token。在 `configure` 方法中,我们配置了哪些请求需要认证,哪些请求不需要认证

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值