当我们使用jwt进行交互时,往往会设置一个单独的请求头Token,在我们进行跨源请求时,会先向服务器发送一个预检请求,而预检请求会被过滤器给拦截
`package backs.back.disposition;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(urlPatterns = “/Log/*”)
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request =(HttpServletRequest)servletRequest;
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
// 如果是预检请求,则直接通过,不进行后续处理
filterChain.doFilter(servletRequest, servletResponse);
return;
}
// try {
System.out.println(3);
String jwt= request.getHeader("Token");
System.out.println(jwt);
System.out.println(4);
JwtUtils.parseJWT(jwt);
System.out.println(5);
filterChain.doFilter(servletRequest,servletResponse);
System.out.println(6);
//}catch (Exception e){
// System.out.println("令牌非法");
// e.printStackTrace();
//` }
}
}
`
在这种情况下,我们如果不排除掉OPTIONS的请求,就会发生错误,当我们自己捕获异常时,会在解析jwt时发送错误,因为预检请求不包含请求头的实际值,jwt为null,这个时候会向客户端返回200响应码,从而误导客户端。
如果我们选择抛出错误,那么会返回500响应码,不论哪一种,都会导致登陆检验的不通过,因此我们需要排除掉预检请求