🔥基于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令牌
java"> 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令牌
java">public void ParseJwt(){Claims claims = Jwts.parser().setSigningKey("秘钥").parseClaimsJws("Jwt令牌字符串") //Jwt令牌字符串.getBody(); //拿到第二部分内容//输出解析的Jwt令牌内容System.out.println(claims);//{name=tom, id=1, exp=1732194534}
}
Jwt令牌工具类
java">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组件支持。
java">@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("拦截到了请求:放行前的逻辑");//放行chain.doFilter(request, response);System.out.println("拦截到了请求:放行后的逻辑");}
}
java">@ServletComponentScan
@SpringBootApplication
public class SpringbootWebMyprojectApplication {public static void main(String[] args) {SpringApplication.run(SpringbootWebMyprojectApplication.class, args);}
}
Filter的应用:
代码:
java">@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 1.获取请求urlHttpServletRequest 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接口
java">@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接口
java">@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}
- 拦截器-拦截路径:
- 拦截器-执行流程
- 登录校验
java">@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {@Override//目标资源方法执行前运行 // 目标资源方法执行前运行public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {// 1.获取请求urlString 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");}
}
java">@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}
java">@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}
🔥 结语:
通过本篇教程的学习,相信你已经对Spring Boot的登录校验有了深入的理解与掌握。
无论是JWT令牌的使用,还是过滤器与拦截器的配置,都将成为你项目中不可或缺的安全利器。
希望本篇教程能够对你的学习与工作有所帮助,让你的SpringBoot项目更加安全、高效!