文章目录
登录拦截实现
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/**");