登录拦截实现

登录拦截实现

01、概述

在开发中比如个人用户中心,后台数据管理等,除了登录,退出,注册,忘记密码等不需要拦截以外其他的全部要进行登录拦截才能访问,

一句话:没有登录不允许进入,为什么这样做呢?因为要记录用户信息和用户行为。

02、在开发过程如何实现和达成呢?

  • 如果接口很少,可以直接在每个业务接口的方法,进行判断即可。

  • 比如我们在开发用户中心,数据后台,需要判断登录接口可能有50多个,那么你必须50个多个地方全部要进行判断。

  • 这种代码是紧耦合,而且会“污染”接口的逻辑,比如:

     @GetMapping("/detail/{blogId}")
        public ModelAndView blogdetail(@PathVariable("blogId") Integer blogId, HttpSession session) {
            // 1; 定义数据模型
            ModelAndView modelAndView = new ModelAndView();
            // 2:获取用户登录的信息
            User user = (User) session.getAttribute(KConstants.SESSION_USER);
            // 3:如果没有登录
            if (user == null) {
                // 4:直接服务器端重定向到登录进行登录
                modelAndView.setViewName("redirect:/login");
                return modelAndView;
            }
            //....此处省略代码
     }
    
  • 如何处理呢?可以利用springmvc提供拦截器来进行处理

03、定义拦截器类LoginInterceptor.java

package com.kuangstudy.handler;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Description:
 * Author: l Administrator
 * Version: 1.0
 * Create Date Time: 2021/12/19 21:45.
 * Update Date Time:
 *
 * @see
 */
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        log.info("111111111111111111------>preHandle 执行进来了");
        // 如果为false,直接阻断,不会处理任何动作,动作必须要你来决定(
        // 1:你可以选择跳转页面,(几乎用不到)
        // 2:你也重定向到你指定路由(常用做法)
        // 3:你也可以用流输出流程(常用做法)
        // 如果拦截器执行完毕,返回true,代表的是:执行完毕逻辑了,去处理你springmvc的路由方法
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("33333333333333333------>postHandle 执行进来了");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("44444444444444444------>afterCompletion 执行进来了");
    }
}

04、定义拦截器类LoginInterceptor进行注册

package com.kuangstudy.config.mvc;

import com.kuangstudy.handler.LogInterceptor;
import com.kuangstudy.handler.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Description:
 * Author: l Administrator
 * Version: 1.0
 * Create Date Time: 2021/12/19 21:49.
 * Update Date Time:
 *
 * @see
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    // 1:把LoginInterceptor放入到ioc容器中
    @Bean
    public LoginInterceptor getLoginInterceptor(){
        return new LoginInterceptor();
    }

    @Bean
    public LogInterceptor getLogInterceptor(){
        return new LogInterceptor();
    }



    //:2:注册拦截器的方法
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // registry.addInterceptor(getLoginInterceptor()) 注册拦截器
        registry.addInterceptor(getLoginInterceptor())
                // 拦截器进入的路由规则是什么,addPathPatterns 代表以下配置的路由都会进行LoginInterceptor
                // 求执行一次在进入路由springmvc的具体方法中
                .addPathPatterns("/detail/**","/","/index")
                // 代表不拦截路由
                .excludePathPatterns("/detail/new/**");


        registry.addInterceptor(getLogInterceptor())
                // 拦截器进入的路由规则是什么,addPathPatterns 代表以下配置的路由都会进行LoginInterceptor
                // 求执行一次在进入路由springmvc的具体方法中
                .addPathPatterns("/detail/**","/","/index")
                // 代表不拦截路由
                .excludePathPatterns("/detail/new/**");
    }
}

05、定义拦截器的执行过程

提醒:拦截器它一定是根据路由规则拦截。

在这里插入图片描述

如下:

  • 开始进入每个拦截器的preHandle方法中全部执行完毕
  • 然后进行具体的拦截器方法中处理
  • 返回过程中先执行postHandle。如果有多个先执行后面,在执行前面的
  • 然后在执行afterCompletion方法,如果有多个先执行后面,在执行前面的

06、未来如果做后台或者个人中心,或者小程序,路由建议

统一增加路由前缀:/admin或者 /api 为什么呢?

遵循一个规则:尽量减少配置,和修改。

registry.addInterceptor(getLoginInterceptor())
                // 拦截器进入的路由规则是什么,addPathPatterns 代表以下配置的路由都会进行LoginInterceptor
                // 求执行一次在进入路由springmvc的具体方法中
                .addPathPatterns("/admin/**");
                
registry.addInterceptor(getLoginInterceptor())
                // 拦截器进入的路由规则是什么,addPathPatterns 代表以下配置的路由都会进行LoginInterceptor
                // 求执行一次在进入路由springmvc的具体方法中
                .addPathPatterns("/api/**");


             // 拦截器进入的路由规则是什么,addPathPatterns 代表以下配置的路由都会进行LoginInterceptor
                // 求执行一次在进入路由springmvc的具体方法中
                .addPathPatterns("/api/**");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值