用户登录后的页面,通过IP可以直接进入,略过登录的过程,此处存在风险。
例:http://localhost:8080/backend/index.html该地址直接访问以下界面,跳过登录过程。
解决手段:使用过滤器或拦截器,在过滤器或拦截中判断用户是否登录,未登录则跳转至登录页面。
方法一:过滤器实现
①在启动类上加入注解@ServletComponentScan
ReggieApplication.java
@Slf4j
@SpringBootApplication
@ServletComponentScan
/*
ServletComponentScan注解作用:
Servlet(控制器)、Filter(过滤器)、Listener(监听器)可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册到Spring容器中,无需其他代码。
*/
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class,args);
log.info("项目启动成功-------------");
}
}
②创建自定义过滤器LoginCheckFilter
③完善过滤器的处理逻辑
LoginCheckFilter.java
/**
* ClassName:LoginCheckFilter
* Description:
*检查用户是否完成登录
* @Author:Hyt
* @Create:2024/1/25 15:13
* @Version 1.0
*/
@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/loginout",
"/backend/**",
"/front/**",
};
//2、判断本次请求是否需要处理
boolean check = check(urls, requestURI);
//3、如果不需要处理,则直接放行.当前端传入的requestURI匹配上urls中的一项时,可直接放行
if(check){
log.info("本次请求{}无需处理",requestURI);
filterChain.doFilter(request,response);//放行
return;
}
//4-1、判断登录状态,如果已登录,则直接放行.当前端传入的requestURI匹配不上urls中的任何一项时,进行该步。
if(request.getSession().getAttribute("employee")!=null){
log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));
filterChain.doFilter(request,response);//放行
return;
}
//5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
log.info("用户未登录");
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
}
/*
@Param:urls
@Param
路径匹配,检查本次请求是否需要放行
*/
public boolean check(String [] urls,String requestURI){
for (String url : urls) {
boolean flag = PATH_MATCHER.match(url, requestURI);
if(flag){
return true;
}
}
return false;
}
}
④调试验证