springboot + mybatis plus项目开发问题优化——过滤器的运用

用户登录后的页面,通过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;
    }
}

④调试验证
在这里插入图片描述

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值