登陆校验
过滤器filter介绍:http://t.csdnimg.cn/CEnyZ
使用过滤器进行登陆校验步骤:
pom.xml中引入阿里巴巴提供的fastjson依赖:
将类对象信息手动转为json数据格式,使用JSONObject中的toJSONString方法内部传入对象,会将传入的对象转换为json数据
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.32</version>
</dependency>
进行登陆校验的类信息:
-
这里使用到JWT令牌的生成和解析的工具类--连接:http://t.csdnimg.cn/kFC3B
package com.springmybatis.filter;
import com.alibaba.fastjson.JSONObject;
import com.springmybatis.pojo.Result;
import com.springmybatis.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.io.IOException;
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 1、获取请求的URL
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
String requestURI = httpServletRequest.getRequestURI(); // 获取到请求的url
log.info("请求的url为{}",requestURI);
// 2、判断是否包含登陆请求----放行
if(requestURI.contains("/login")){
log.info("登陆请求---放行");
filterChain.doFilter(servletRequest,servletResponse);
return; // 放行后不再执行后续逻辑
}
// 3、获取请求头中携带JWT令牌的信息
String JWT = httpServletRequest.getHeader("token"); // 这里使用请求头token字段保存JWT令牌信息
// 4、判断JWT令牌是否为空---返回错误信息
boolean isEmpty = StringUtils.hasLength(JWT);
if(!isEmpty){
log.info("JWT令牌为空---返回错误信息");// 注意这理没有使用@RestController注解,直接返回不会将返回的结果自动转为json数据
Result noLogin = Result.error("NO_LOGIN");
// 这里使用阿里巴巴中的fastjson方法进行手动转换----需要导入fastjson工具包
String jsonString = JSONObject.toJSONString(noLogin); // 使用JSONObject中的toJSONString方法内部传入对象,会将传入的对象转换为json数据
// 将错误信息响应给浏览器
httpServletResponse.getWriter().write(jsonString);
return;
}
// 5、解析JWT令牌,报错返回错误信息,没有报错放行
try{
JwtUtils.ParseJWT(JWT); // 调用JWT工具类中解析JWT令牌的方法
}catch (Exception e){
e.printStackTrace();
log.info("JWT令牌错误或时间过期---返回错误信息");
Result noLogin = Result.error("NO_LOGIN");
String jsonString = JSONObject.toJSONString(noLogin);
httpServletResponse.getWriter().write(jsonString);
return;
}
// 到此表示JWT令牌没有错误
log.info("JWT令牌合法--放行");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}