先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
org.springframework.boot
spring-boot-starter-parent
2.5.3
com.uncle
jwt-demo
0.0.1-SNAPSHOT
jwt-demo
Demo project for Spring Boot
<java.version>1.8</java.version>
com.auth0
java-jwt
3.4.0
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
com.alibaba
fastjson
1.2.48
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
5.2 自定义注解
package com.uncle.jwtdemo.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
-
@program: jwt-demo
-
@description: 跳过验证
-
@author: 步尔斯特
-
@create: 2021-08-07 16:18
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {
boolean required() default true;
}
package com.uncle.jwtdemo.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
-
@program: jwt-demo
-
@description: 需要登录才可以进行操作
-
@author: 步尔斯特
-
@create: 2021-08-07 16:19
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserLoginToken {
boolean required() default true;
}
5.3 用户实体类
package com.uncle.jwtdemo.bean;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
-
@program: jwt-demo
-
@description:
-
@author: 步尔斯特
-
@create: 2021-08-07 16:21
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
String Id;
String username;
String password;
//获取token的方法
public String getToken(User user) {
String token=“”;
token= JWT.create().withAudience(user.getId())
.sign(Algorithm.HMAC256(user.getPassword()));
return token;
}
}
5.4 创建拦截器
package com.uncle.jwtdemo.config;
import com.uncle.jwtdemo.interceptor.AuthenticationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
-
@program: jwt-demo
-
@description:
-
@author: 步尔斯特
-
@create: 2021-08-07 16:25
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationInterceptor())
.addPathPatterns(“/**”);
}
@Bean
public AuthenticationInterceptor authenticationInterceptor() {
return new AuthenticationInterceptor();
}
}
5.5 认证的拦截器
package com.uncle.jwtdemo.interceptor;
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;
import com.uncle.jwtdemo.annotations.PassToken;
import com.uncle.jwtdemo.annotations.UserLoginToken;
import com.uncle.jwtdemo.bean.User;
import com.uncle.jwtdemo.service.UserService;
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/**
-
@program: jwt-demo
-
@description:
-
@author: 步尔斯特
-
@create: 2021-08-07 16:22
*/
public class AuthenticationInterceptor implements HandlerInterceptor {
@Autowired
UserService 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();
//检查是否有passtoken注释,有则跳过认证
if (method.isAnnotationPresent(PassToken.class)) {
PassToken passToken = method.getAnnotation(PassToken.class);
if (passToken.required()) {
return true;
}
}
//检查有没有需要用户权限的注解
if (method.isAnnotationPresent(UserLoginToken.class)) {
UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
if (userLoginToken.required()) {
// 执行认证
if (token == null) {
throw new RuntimeException(“无token,请重新登录”);
}
// 获取 token 中的 user id
String userId;
try {
userId = JWT.decode(token).getAudience().get(0);
} catch (JWTDecodeException j) {
throw new RuntimeException(“401”);
}
User user = userService.findUserById(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 RuntimeException(“401”);
}
return true;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) throws Exception {
}
}
5.6 用户业务
package com.uncle.jwtdemo.service;
import com.uncle.jwtdemo.bean.User;
/**
-
@program: jwt-demo
-
@description:
-
@author: 步尔斯特
-
@create: 2021-08-07 16:30
*/
public interface UserService {
User findByUsername(User user);
User findUserById(String id);
}
package com.uncle.jwtdemo.service.impl;
import com.uncle.jwtdemo.bean.User;
import com.uncle.jwtdemo.service.UserService;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
-
@program: jwt-demo
-
@description:
-
@author: 步尔斯特
-
@create: 2021-08-07 16:48
*/
@Service
public class UserServiceImpl implements UserService {
private static Map<String, User> userMap = new HashMap<>();
@Override
public User findByUsername(User user) {
return userMap.get(user.getUsername());
}
@Override
public User findUserById(String id) {
return userMap.get(id);
}
static {
userMap.put(“1”, new User(“1”, “zhangsan”, “123”));
userMap.put(“zhangsan”,new User(“1”,“zhangsan”,“123”));
}
}
5.7 token业务
package com.uncle.jwtdemo.service;
import com.uncle.jwtdemo.bean.User;
/**
-
@program: jwt-demo
-
@description:
-
@author: 步尔斯特
-
@create: 2021-08-07 16:37
*/
public interface TokenService {
String getToken(User userForBase);
}
package com.uncle.jwtdemo.service.impl;
import com.uncle.jwtdemo.bean.User;
import com.uncle.jwtdemo.service.TokenService;
import org.springframework.stereotype.Service;
/**
-
@program: jwt-demo
-
@description:
-
@author: 步尔斯特
-
@create: 2021-08-07 17:26
*/
@Service
public class TokenServiceImpl implements TokenService {
@Override
public String getToken(User userForBase) {
return userForBase.getToken(userForBase);
}
}
5.8 测试接口
package com.uncle.jwtdemo.controller;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.uncle.jwtdemo.annotations.UserLoginToken;
import com.uncle.jwtdemo.bean.User;
import com.uncle.jwtdemo.service.TokenService;
import com.uncle.jwtdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
-
@program: jwt-demo
-
@description:
-
@author: 步尔斯特
-
@create: 2021-08-07 16:27
*/
@RestController
@RequestMapping(“api”)
public class UserApi {
@Autowired
UserService userService;
@Autowired
TokenService tokenService;
//登录
@PostMapping(“/login”)
public Object login(@RequestBody User user) {
JSONObject jsonObject=new JSONObject();
User userForBase=userService.findByUsername(user);
if(userForBase==null){
try {
jsonObject.put(“message”,“登录失败,用户不存在”);
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObject;
}else {
if(!userForBase.getPassword().equals(user.getPassword())){
try {
jsonObject.put(“message”,“登录失败,密码错误”);
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObject;
}else {
String token = tokenService.getToken(userForBase);
try {
jsonObject.put(“token”, token);
} catch (JSONException e) {
e.printStackTrace();
}
try {
jsonObject.put(“user”, userForBase);
} catch (JSONException e) {
e.printStackTrace();
}
System.out.println(jsonObject);
return jsonObject;
}
}
}
@UserLoginToken
@GetMapping(“/getMessage”)
public String getMessage(){
return “你已通过验证”;
}
}
5.9 测试模版
GET http://localhost:8080/api/getMessage
Accept: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIn0.ihOZFzg3ZGIbBMneRy-4RMqors1P3nuO-wRJnQtTzWQ
POST http://localhost:8080/api/login
Content-Type: application/json
{“username”: “zhangsan”,“password”: “123”}
总结
面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。
以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ln(jsonObject);
return jsonObject;
}
}
}
@UserLoginToken
@GetMapping(“/getMessage”)
public String getMessage(){
return “你已通过验证”;
}
}
5.9 测试模版
GET http://localhost:8080/api/getMessage
Accept: application/json
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIn0.ihOZFzg3ZGIbBMneRy-4RMqors1P3nuO-wRJnQtTzWQ
POST http://localhost:8080/api/login
Content-Type: application/json
{“username”: “zhangsan”,“password”: “123”}
总结
面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。
以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考
[外链图片转存中…(img-m6tmhlks-1713422342489)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-TgR0WukN-1713422342489)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!