【实战day02】完善登录功能及补充静态资源映射

1. 完善登录功能

前面我们已经完成了后台系统的员工登录功能开发,但还是存在一个问题,就是我们用户如果不登录直接访问系统首页,照常可以访问。

显然,这种情况是不合理的,我们希望看到的效果应该是,只有登录成功才可以访问系统的首页,如果每页登录则跳转到登录页面。

那么,如何实现这种功能呢?
答案就是拦截器或者过滤器,在拦截器或者过滤器中判断用户是否登录,每页登录则跳转到登录页面。

1.1 创建自定义过滤器LoginCheckFilter

我们新建一个包filter,在包里添加LoginCheckFilter过滤器。我们需要在类上添加@WebFilter注解标志该类为过滤器,并且需要声明过滤器名称以及拦截规模,/*即表明全部拦截。

@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
}

1.2 在启动类添加注解@ServletComponentScan

@Slf4j
@SpringBootApplication
//扫描拦截器的注解声明
@ServletComponentScan(basePackages = "com.hx.filter")
public class BingBingApplication {
    public static void main(String[] args) {
        SpringApplication.run(BingBingApplication.class,args);
        System.out.println("项目初始化完成");
        log.info("项目启动成功");
    }
}

1.3 完善过滤器的处理逻辑

过滤器的处理逻辑如下:
* 1. 获取本次请求的uri,并定义不需要拦截的路径请求
* 2. 判断是否是需要拦截的路径
* 3. 如果不需要处理,直接放行
* 4. 判断是否登录,登录就放行
* 5. 如果未登录就响应未登录,与前端进行信息交互。
在这里插入图片描述

/**
 * 过滤器,检查用户是否登录
 * 开启过滤器需要在启动类添加@ServletComponentScan进行过滤器扫描
 */
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {

    //路径匹配器,可以匹配一个通配符
    private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

    public boolean check(String[] uris,String requestURI){
        for (String uri : uris) {
            boolean flag = PATH_MATCHER.match(uri, requestURI);
            if(flag){
                return true;
            }
        }
        return false;
    }

    @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();
        String[] uris = new String[]{
                "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

        //2. 判断是否是需要拦截的路径
        boolean check = check(uris, requestURI);

        //3. 如果不需要处理,直接放行
        if(check){
            //对拦截到的请求进行放行操作
            filterChain.doFilter(request,response);
            return;
        }

        //4. 判断是否登录,登录就放行
        //从我们存入的session中获取数据,如果session中有数据,则表明登录成功,放行
        HttpSession session = request.getSession();
        Object employee = session.getAttribute("employee");
        if(employee!=null){
            filterChain.doFilter(request,response);
            return;
        }

        // 5. 如果未登录就响应未登录,与前端进行信息交互。
        //write传递字符串,需要将R对象转换成JSON字符串,传递的信息需要跟requset.js中的信息匹配。
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;
    }

}

注意,第五步中跟前端进行交互返回的信息需要跟前端进行匹配。我们来看一下前端响应拦截器的方法。
在这里插入图片描述
第一个红框是根据服务端返回的数据进行判断,判断服务端返回的data中code是不是为0并且msg是不是为NOTLOGIN,判断通过的话就执行下面红框中页面跳转的操作。

设置拦截器之后,如果用户为进行登录就访问首页就会自动跳转到登陆页面。

这里我们访问一下首页,回车,因为没有登录,因此就会进行登录页面跳转
在这里插入图片描述
在这里插入图片描述

2. 静态资源映射

我们将前端开发人员提供的页面信息直接放到我们的resource目录下,启动我们的服务器是无法直接访问到的,因此,我们需要设置一个静态资源映射器,映射我们的静态资源页面
在这里插入图片描述

首先我们需要定义一个类来继承我们的WebMvcConfigurationSupport,并实现该类中的addResourceHandlers方法。然后重写该方法。将我们路径中包含/backend/**就帮我们映射到classpath:/backend/指定位置

记得添加@Configuration注解将其标志为我们的配置类。

@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    /**
     * 设置我们的静态资源映射
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //路径中包含/backend/**就帮我们映射到classpath:/backend/指定位置。
        registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
        registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
    	}
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值