瑞吉外卖(4) - 完善登录功能-拦截非法请求

问题分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUjxW3lu-1653643783703)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527162826872.png)]

可以直接输出网址访问后台

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPOCsgoY-1653643783705)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527163033424.png)]

代码实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jsPneVBZ-1653643783706)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527163211682.png)]

新建filter包,编写LoginCheckFilter

package com.taotao.reggie.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * create by 刘鸿涛
 * 2022/5/27 16:33
 * 检查用户是否已经完成登录
 */
@SuppressWarnings({
    
    "all"})
@Slf4j  //日志
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Component
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);
    }
}

功能测试

访问内部页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzj6ohPO-1653643783707)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527165327121.png)]

拦截成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hlk3FJE3-1653643783707)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527165405726.png)]

完善处理逻辑(完善)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4RY5jp2f-1653643783708)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527165759961.png)]

增强LoginCheckFilter.java

package com.taotao.reggie.filter;

import com.alibaba.fastjson.JSON;
import com.taotao.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
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;

/**
 * create by 刘鸿涛
 * 2022/5/27 16:33
 * 检查用户是否已经完成登录
 */
@SuppressWarnings({
    
    "all"})
@Slf4j  //日志
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Component
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;   //向下转型

        //获取本次请求的URI
        String requestURI = request.getRequestURI();    // /backend/index.html
        //定义不需要出的请求路径
        String[] urls = new String[]{
    
    
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

        //2.判断本次请求是否需要处理
        boolean check = check(urls, requestURI);

        //3.如果不需要处理,则直接放行
        if(check){
    
    
            filterChain.doFilter(request,response);
            return;
        }

        //4.判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null){
    
    
            filterChain.doFilter(request,response);
            return;
        }

        //5.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

//        log.info("拦截到请求:{}",request.getRequestURI());
//        filterChain.doFilter(request,response);
    }

    /**
     * 路径匹配,检查本次请求是否需要放行
     * @param 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;
    }
}

加入日志LoginCheckFilter.java

package com.taotao.reggie.filter;

import com.alibaba.fastjson.JSON;
import com.taotao.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
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;

/**
 * create by 刘鸿涛
 * 2022/5/27 16:33
 * 检查用户是否已经完成登录
 */
@SuppressWarnings({
    
    "all"})
@Slf4j  //日志
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Component
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;   //向下转型

        //获取本次请求的URI
        String requestURI = request.getRequestURI();    // /backend/index.html

        log.info("拦截到请求:{}",requestURI);

        //定义不需要出的请求路径
        String[] urls = new String[]{
    
    
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

        //2.判断本次请求是否需要处理
        boolean check = check(urls, requestURI);

        //3.如果不需要处理,则直接放行
        if(check){
    
    
            log.info("本次请求{}不需要处理",requestURI);
            filterChain.doFilter(request,response);
            return;
        }

        //4.判断登录状态,如果已登录,则直接放行
        if(request.getSession().getAttribute("employee") != null){
    
    
            log.info("用户已登录,用户id为{}",request.getSession().getAttribute("employee"));
            filterChain.doFilter(request,response);
            return;
        }

        log.info("用户未登录");
        //5.如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

//        log.info("拦截到请求:{}",request.getRequestURI());
//        filterChain.doFilter(request,response);
    }

    /**
     * 路径匹配,检查本次请求是否需要放行
     * @param 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;
    }
}

功能测试

直接访问非登录页面

无法访问,直接被拖拽回登录页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E9jTu5bS-1653643783709)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527172524682.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfIwR4y3-1653643783710)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527172649446.png)]

登录成功后访问

访问正常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x2SDM4oD-1653643783710)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527172609811.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBhIbNnB-1653643783711)(%E7%91%9E%E5%90%89%E5%A4%96%E5%8D%96.assets/image-20220527172657572.png)]

猜你喜欢

转载自blog.csdn.net/qq_39123467/article/details/125008102
今日推荐