SpringBoot项目中使用拦截器进行请求的拦截
在没有拦截器拦截前端请求的情况下,即使用户不进行登录,却依然能够进入系统。这显然是不合理的。这里使用拦截器对其请求进行一个拦截并且过滤。将那些需要需要用户登录才能够展示的界面进行一个拦截,如果用户没有登录,就需要跳转到登录界面进行登录。
没有拦截器的效果展示
此时我们没有登录,但是在访问http://localhost:8080/backend/index.html时依然可以成功访问。
添加拦截器的思路分析
在未登录的情况下需要返回什么信息,需要结合前端的处理。如下图所示,如果未登录,需要给前端传一个"NOTLOGIN"。
代码实现
自定义过滤器:自定义一个过滤器 LoginCheckFilter 并实现 Filter 接口, 在doFilter方法中完成校验的逻辑。
点击查看代码
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
//路径匹配器,并且支持通配符
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;
//获取本次请求的路径
String requestURI = request.getRequestURI();
//定义不需要拦截的路径
List<String> noFilterUris = new ArrayList<>();
noFilterUris.add("/employee/login");
noFilterUris.add("/employee/logout");
noFilterUris.add("/backend/**");
noFilterUris.add("/front/**");
//判断本次请求是否需要被拦截
for (int i = 0; i < noFilterUris.size(); i++) {
String noFilterUri = noFilterUris.get(i);
if (PATH_MATCHER.match(noFilterUri,requestURI)){
log.info("本次请求不需要处理--->"+requestURI);
filterChain.doFilter(request,response);
return;
}
}
//判断用户是否登录
if (request.getSession().getAttribute("employee")!=null){
log.info("用户已登录");
filterChain.doFilter(request,response);
return;
}
//用户未登录,通过输出流的方式向客户端页面响应数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
}
AntPathMatcher 拓展:
介绍: Spring中提供的路径匹配器 ;
分类:
Java / other
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)