package com.zyp.config;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
/**
* @author syl
* @description TODO
* @since 2022/3/7
*/
//把LoginFilter注册到Spring容器中
@Component
//多个过滤器时,值越越先执行
@Order(1)
public class LoginFilter implements Filter {
private static Logger LOGGER = LoggerFactory.getLogger(LoginFilter.class);
/**
* 存放一些不需要过滤的
*/
private static List<String> noCheckList;
static {
noCheckList= Lists.newArrayList();
noCheckList.add("/student/info/login");
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest= (HttpServletRequest) request;
//返回请求时的完整URL http://localhost:9002/student/info/getInfoBySno
System.out.println("getRequestURL="+httpServletRequest.getRequestURL());
//返回请求时的资源名部分 /student/info/getInfoBySno
String requestURI = httpServletRequest.getRequestURI();
System.out.println("getRequestURI="+ requestURI);
//方法返回请求行中的参数部分(参数名+值)
System.out.println("getQueryString="+httpServletRequest.getQueryString());
//返回发出请求的客户机的完整主机名
System.out.println("getRemoteHost="+httpServletRequest.getRemoteHost());
//返回发出请求的客户机的IP地址
System.out.println("getRemoteAddr="+httpServletRequest.getRemoteAddr());
//返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以"/"开头
System.out.println("getPathInfo="+httpServletRequest.getPathInfo());
//返回客户机所使用的网络端口号
System.out.println("getRemotePort="+httpServletRequest.getRemotePort());
//返回WEB服务器的IP地址
System.out.println("getLocalAddr="+httpServletRequest.getLocalAddr());
//返回WEB服务器的主机名
System.out.println("getLocalName="+httpServletRequest.getLocalName());
LOGGER.info("LoginFilter");
if(isChain(requestURI)){
//放行
chain.doFilter(request, response);
return;
}else{
String token = httpServletRequest.getHeader("token");
if (StringUtils.isBlank(token)){
token = httpServletRequest.getParameter("token");
}
if(StringUtils.isNotBlank(token)){
chain.doFilter(request, response);
}else{
LOGGER.error("路径拦截");
}
return;
}
}
/**
* 判断是否不需要拦截
* @param path
* @return
*/
private boolean isChain(String path){
return noCheckList.contains(path);
}
@Override
public void destroy() {
}
}
注:一个请求先到过滤器–>拦截器—>参数解析器—>AOP