完善登录功能
用户不登录不能访问系统其它页面,否则跳转到登录页面。
使用拦截器或过滤器,在拦截器或过滤器中判断用户是否已经完成登录,如果没有登录则跳转到登录页面。
(1)创建自定义过滤器(LoginCheckFilter)
package com.itheima.filter;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 检查用户是否已经完成登录
*/
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
log.info("拦截到请求: {}", request.getRequestURI());
filterChain.doFilter(request, response);
}
}
(2)在启动类上加入注解@ServletComponentScan
package com.itheima; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.ComponentScan; @Slf4j @SpringBootApplication @ServletComponentScan public class ReggieTakeOutApplication { public static void main(String[] args) { SpringApplication.run(ReggieTakeOutApplication.class, args); log.info("项目启动成功"); } }
(3)完善过滤器的处理逻辑
package com.itheima.filter; import com.alibaba.fastjson.JSON; 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 javax.servlet.http.HttpSession; import java.io.IOException; /** * 检查用户是否已经完成登录 */ @WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*") @Slf4j 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; //1、获取本次请求的URI String requestURI = request.getRequestURI(); log.info("拦截到请求:{}", requestURI); //定义不需要处理的请求路径 String[] urls = new String[]{ "/employee/login", "/employee/logout", "/backend/**", "/front/**" }; //2、判断本次请求是否需要处理 boolean check = check(urls, requestURI); // 3、如果不需要处理,则直接放行 if(check){ filterChain.doFilter(request, response); log.info("本次请求不需要处理:{}", requestURI); return; } //4、判断登录状态,如果已登录,则直接放行 if(request.getSession().getAttribute("employee")!=null){ filterChain.doFilter(request, response); log.info("用户已登录,用户id为:{}", request.getSession().getAttribute("employee")); return; } //5、如果未登录则返回未登录结果,通过输出流方式向客户端响应数据 response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN"))); log.info("用户未登录:{}", requestURI); return; } /** * 路径匹配,检查本次请求是否需要放行 */ public boolean check(String urls[], String requestURI){ for(String url : urls){ boolean match = PATH_MATCHER.match(url, requestURI); if(match){ return true; } } return false; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构