登录拦截器

文章介绍了如何在Spring框架中使用HandlerInterceptor实现登录拦截功能。创建了loginInterceptor.java,实现了预处理方法preHandle进行登录检查,如果session中无username信息则重定向到登录页面。在AdminWebConfig.java中配置拦截器,排除特定的登录和静态资源请求。前端通过session获取登录提示信息。


前言

本篇主要介绍spring框架里提供的 HandlerInterceptor 拦截器做登录拦截。


一、interceptor

1.interceptor 包下新建loginInterceptor.java

继承spring框架里的 HandlerInterceptor 接口,提供了三个方法做拦截,这里使用了第一个方法 preHandle 。

/*
登录检查
1.配置好拦截器需要拦截哪些请求
2.将这些配置放在容器中
*/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    // 目标方法执行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 打印日志:拦截的请求路径
        String requestURL = request.getRequestURI();
        log.info("拦截的请求路径是{}",requestURL);
        // 登录逻辑检查
        HttpSession session = request.getSession();
        Object loginUsername = session.getAttribute("username");
        if (loginUsername != null){
            return true;//session里有loginUsername信息放行
        }

        //否则拦截,添加返回登录页面的错误信息,重定向到登录页
        session.setAttribute("msg","请先登录");//前端{session.msg}接收
        response.sendRedirect("/user/login");
//        request.setAttribute("msg","请先登录");
//        request.getRequestDispatcher("/user/login").forward(request,response);
        return false;
    }

    // 目标方法执行完成之后
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

2.config 包下新建 AdminWebConfig.java

配置:继承spring框架里的 HandlerInterceptor 接口,使用提供的 addInterceptors 方法,注册上面写的拦截器 LoginInterceptor 。
拦截所有的请求,放行登录相关请求和一些静态资源请求。

@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")//默认拦截所有请求,包括静态资源
                // 改成/*放过了静态资源,教学视频里的弹幕提示,尝试有效但存疑。/*表示一层路径(多个字符),/**表示n层目录。不用这个方法最好。
                // .addPathPatterns("/*")
                .excludePathPatterns("/user/login","/user/toLogin","/validateCode","/user/reg","/user/checkUsername","/user/toReg",
                        "/user/**");//放行这些请求(去登录页、登录验证、验证码资源获取)"/user/**"表示放过静态资源static文件夹下的user文件夹所有静态资源
    }
}

3.返回登录页面接收提示信息

前端登录的提示信息有两种,一个通过 session 的 session.setAttribute() 传值, $ {session.msg} 接收;一种通过 model.addAttribute() 传值,$ {msg} 接收。
记得登录信息验证时,把拦截器用 session 传的提示信息清空。

<span th:text="${msg}" style="color: red"></span>
<span th:text="${session.msg}" style="color: red"></span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值