SpringBoot之拦截器登录检查与静态资源放行

访问网站的时候,不经过login直接访问后续网页时不被允许的,可以先将登录信息放入session中,当访问后续页面的时候,看看session中是否有值就可以了,但是当页面多了,每个页面都得判断这就太麻烦了。用拦截器就方便多了。

1.先编写一个拦截器类实现HanderInterceptor接口

public class LoginInterceptor  implements HandlerInterceptor {
    /**
     * 目标方法执行之前
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //打印日志:
        String requestURI=request.getRequestURI();
        log.info("preHandle拦截的请求路径是{}",requestURI);
        //检测登录逻辑
        HttpSession session=request.getSession();
        Object loginUser=session.getAttribute("LoginUser");//LoginUser这个名是之前登录时放进session的
        if (loginUser!=null){
            //放行
            return true;
        }
        //拦截住,未登录-》跳转到登录页
        request.setAttribute("msg","请先登录");    						      
        request.getRequestDispatcher("/").forward(request,response);//转发到login页面
        return false;
    }

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

    /**
     * ye
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

重写上述三个方法,preHandle方法中获取session,如果为空则拦截,转发到login页面,并提示“请登录”,不为空则放行。那么在之前判断main中是否有session的地方直接这样写就行。后面的页面统一这样判断就可以了。

    /**
     * 真正是去main页面
     * @return
     */
    @GetMapping("/main.html")
    public String mainPage(HttpSession session,Model model){
        //是否登录 拦截器 登录器
        log.info("当前方法时{}","mainPage");
        return "main";
        //进入main中得进行判断是否登录,用放进去得session进行判断空则登录非空则没登陆
        //要不然在输上main.html得页面路径就可进入main中
//        Object loginUser=session.getAttribute("LoginUser");
//        if(loginUser!=null){
//            return  "main";
//        }else{
//            model.addAttribute("msg","请重新登录");
//            return "login";
//        }
      
    }

2.拦截器注册到容器中,实现WebMvcConfigurer的addInterceptors接口
3.指定拦截规则【如果拦截所有,静态资源也会被拦截】

@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())//使用那个拦截器
                .addPathPatterns("/**")//所有请求都被拦截包括静态资源了。
                .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//设置要放行的页面。
    }
}

WebMvcConfigurer实现定制了web功能的类,在类中重写了addInterceptors方法并将之前写的拦截器放入,并用这两个制定拦截规则addPathPatterns("/**")//所有请求都被拦截包括静态资源了。 .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**");//设置要放行的页面。拦截所有并将静态资源放行(页面所需的css,js,image等)。
通过打印日志运行过程时过程
先preHandle,再目标方法mainPage,再postHandle,后afterCompletion

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值