基于springboot的登录校验
🔥基于springboot的登录校验🔥
文章目录
- 🔥基于springboot的登录校验🔥
- 1. JWT令牌
- 2. 过滤器Filter
- 3. 拦截器Interceptor
🚀 开篇寄语:
还在为Spring Boot项目的登录校验而一筹莫展吗?本篇实战教程将是你破解这一难题的钥匙,从JWT令牌的生成与解析,到过滤器与拦截器的巧妙运用,我们将一步步揭开Spring Boot登录校验的神秘面纱,让你的项目安全性瞬间提升!
📖 精彩预告:
JWT令牌实战: 深入剖析JWT令牌的结构与原理,教你如何轻松生成与解析令牌,实现高效安全的登录认证。
过滤器Filter详解: 过滤器在Spring Boot中的强大作用,如何配置过滤器实现登录校验等特殊功能。
拦截器Interceptor应用: 拦截器的定义与配置,以及在登录校验中的实战应用,让你的项目更加灵活可控。
💡 为什么值得一读:
本篇教程不仅涵盖了Spring Boot登录校验的核心知识点,更通过实战案例让你深入理解每个细节。
无论你是初学者还是有一定经验的开发者,都能从中获得宝贵的经验与启示。通过本篇教程的学习,你将能够轻松应对Spring Boot项目中的登录校验问题,提升项目的安全性与可靠性。
1. JWT令牌
场景:登录认证
① 登录成功后,生成令牌
② 后续每个请求,都要携带JWT令牌,系统每次处理请求前,先进行令牌校验,通过后再处理请求
组成 | 描述 | 例子 |
---|---|---|
Header(头) | 记录令牌类型、签名算法等 | {“alg”:“HS256”, “type”: “JWT”} |
Payload(有效载荷) | 携带自定义信息 | {“id”:“1”, “username”: “tom”} |
Signature(签名) | 防止token被串改 | 由header+payload+密钥+签名算法 |
pom.xml依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
创建Jwt令牌
public void creatJwt(){
//定义map集合来封装自定义数据
Map<String, Object> claims = new HashMap<>();
claims.put("id", 1);
claims.put("username", "tom");
String jwt = Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS256, "秘钥")
.setExpiration(new Date(System.currentTimeMillis() + 3600*1000))//设置JWT令牌有效期 -> 1h
.compact();
System.out.println(jwt);
}
解析Jwt令牌
public void ParseJwt(){
Claims claims = Jwts.parser()
.setSigningKey("秘钥")
.parseClaimsJws("Jwt令牌字符串") //Jwt令牌字符串
.getBody(); //拿到第二部分内容
//输出解析的Jwt令牌内容
System.out.println(claims);//{name=tom, id=1, exp=1732194534}
}
Jwt令牌工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtil {
private static String signKey = "itheima";
private static Long expire = 43200000L;
public static String creatJwt(Map<String, Object> claims) {
claims.put("id", 1);
claims.put("username", "tom");
String jwt = Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS256, signKey)
.setExpiration(new Date(System.currentTimeMillis() + expire))//设置JWT令牌有效期 -> 1h
.compact();
return jwt;
}
public static Claims ParseJwt(String jwt) {
Claims claims = Jwts.parser()
.setSigningKey(signKey) //给予前面自己生成JWT令牌所设置的签名秘钥才可以解析JWT令牌
.parseClaimsJws(jwt) //Jwt令牌字符串
.getBody(); //拿到第二部分内容
//输出解析的Jwt令牌内容
return claims;
}
}
2. 过滤器Filter
过滤器可以把请求拦截下来,实现一些特殊功能:登录校验,敏感字符处理等
- 定义Filter: 定义一个类,实现Filter接口
- 配置Filter: Filter类上加@WebFilter注解,配置拦截资源的路径,引导类上加@ServeletComponentScan开启对Servlet组件支持。
@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("拦截到了请求:放行前的逻辑");
//放行
chain.doFilter(request, response);
System.out.println("拦截到了请求:放行后的逻辑");
}
}
@ServletComponentScan
@SpringBootApplication
public class SpringbootWebMyprojectApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootWebMyprojectApplication.class, args);
}
}
Filter的应用:
代码:
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 1.获取请求url
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String url = req.getRequestURL().toString();
log.info("请求的url:{}", url);
// 2.判断url是否包含login,如果包含为登录操作,放行
if(url.contains("login")){
log.info("登录操作,放行...");
chain.doFilter(request,response);
return;
}
// 3.获取请求头的JWT令牌
String jwt = req.getHeader("token");
// 4.判断令牌是否存在,不存在返回错误
if(!StringUtils.hasLength(jwt)){
log.info("请求头token为空,返回未登录");
Result error = Result.error("NOT_LOGIN");
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return;
}
// 5.解析JWT,解析失败返回错误
try {
JwtUtil.parseJwt(jwt);
} catch (Exception e) {
e.printStackTrace();
log.info("解析令牌失败,返回错误信息");
Result error = Result.error("NOT_LOGIN");
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return;
}
// 6.放行
log.info("令牌合法");
chain.doFilter(request,response);
}
}
3. 拦截器Interceptor
- 定义拦截器: 实现HandlerInterceptor接口
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override//目标资源方法执行前运行 // 目标资源方法执行前运行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行前preHandle");
return true;
}
@Override//目标资源方法执行后运行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行后postHandle");
}
@Override//视图渲染完毕后运行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("渲染完毕afterCompletion");
}
}
- **配置拦截器:**定义配置类,实现WebMvcConfigurer接口
@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
}
}
- 拦截器-拦截路径:
- 拦截器-执行流程
- 登录校验
@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override//目标资源方法执行前运行 // 目标资源方法执行前运行
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
// 1.获取请求url
String url = req.getRequestURL().toString();
log.info("请求的url:{}", url);
// 2.判断url是否包含login,如果包含为登录操作,放行
if(url.contains("login")){
log.info("登录操作,放行...");
return true;
}
// 3.获取请求头的JWT令牌
String jwt = req.getHeader("token");
// 4.判断令牌是否存在,不存在返回错误
if(!StringUtils.hasLength(jwt)){
log.info("请求头token为空,返回未登录");
Result error = Result.error("NOT_LOGIN");
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return false;
}
// 5.解析JWT,解析失败返回错误
try {
JwtUtil.parseJwt(jwt);
} catch (Exception e) {
e.printStackTrace();
log.info("解析令牌失败,返回错误信息");
Result error = Result.error("NOT_LOGIN");
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return false;
}
// 6.放行
log.info("令牌合法");
return true;
}
@Override//目标资源方法执行后运行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行后postHandle");
}
@Override//视图渲染完毕后运行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("渲染完毕afterCompletion");
}
}
@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
}
@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginCheckInterceptor loginCheckInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
}
🔥 结语:
通过本篇教程的学习,相信你已经对Spring Boot的登录校验有了深入的理解与掌握。
无论是JWT令牌的使用,还是过滤器与拦截器的配置,都将成为你项目中不可或缺的安全利器。
希望本篇教程能够对你的学习与工作有所帮助,让你的SpringBoot项目更加安全、高效!