package com.itheima.filter;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.itheima.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 1.首先创建过滤类
* 2.实现Filter
* 3.toFilter方法
* 4.可以将servletRequest转为Http类型的
* 5.获取本次的url
* 6.定义不需要登录校验的请求路径
* 7.首先定义一个路径匹配器,支持通配符
* 8.定义一个匹配请求路径方法,参数两个(放行的url,当前路径)
* 9.遍历放行的路径,路径匹配器的一个方法match
* 10.进行判断,如果存在则返回true,没有则false
* 11.定义方法,回到是否需要处理,,如果不需要直接放行
* 12.判短登录状态,如果已经登录,则直接放行
* 13.如果未登录则返回未登录录结果,通过输出流的方式向客户端响应数据
* 14.resopnse。getWriter().write。toString(Json.toJSONString(“错误信息,在前端的request。js文件中响应器那块”))
*/
//1.首先创建过滤类
//2.实现Filter
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LogCheckFilter implements Filter {
//7.首先定义一个路径匹配器,可以处理通配符(antpathmatcher)
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
//3.toFilter方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//4.可以将servletRequest转为Http类型的
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//5.获取本次的url
String requestURI = request.getRequestURI();
log.info("拦截到请求:{}",requestURI);
//6.定义不需要登录校验的请求路径
/* String[] urls=new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};*/
String[] urls = {"/employee/login", "/employee/logout", "/backend/**", "/front/**"};
//11.判断本次请求是否需要处理
boolean matchUrl = matchUrl(urls, requestURI);
//12.定义方法,回到是否需要处理,,如果不需要直接放行
if (matchUrl) {
log.info("本次请求{}不需要处理",requestURI);
filterChain.doFilter(request, response);
return;
}
//13.判短登录状态,如果已经登录,则直接放行
if (request.getSession().getAttribute("employee")!=null) {
log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
filterChain.doFilter(request,response);
return;
}
log.info("用户未登录");
//14.如果未登录则返回未登录录结果,通过输出流的方式向客户端响应数据
//14+.resopnse。getWriter().write。(Json.toJSONString(“错误信息,在前端的request。js文件中响应器那块”))
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
//15.日志输出拦截到的请求
return;
}
//8.定义一个匹配请求路径方法,参数两个(放行的url,当前路径)
public boolean matchUrl(String[] urls, String requestURI) {
//9.遍历放行的路径,路径匹配器的一个方法match
for (String url : urls) {
boolean match = PATH_MATCHER.match(url, requestURI);
if (match) {
//10.进行判断,如果存在则返回true,没有则false
return true;
}
}
return false;
}
}
mp-过滤器-学习笔记
最新推荐文章于 2024-04-03 16:40:46 发布