SpringBoot中如何基于拦截器实现登录验证呢?
下文笔者讲述SpringBoot中使用拦截器实现登录验证的方法及示例分享,如下所示
拦截器简介
拦截器在SpringMVC中用于拦截controller请求
是一种方法的动态拦截技术
如:
Interceptor
==================================================================
SpringBoot提供Interceptor拦截器机制
用于请求预处理和后处理
SpringBoot中定义一个拦截器有两种方法
第一种是实现 HandlerInterceptor 接口
或继承实现HandlerInterceptor 接口的类(如:HandlerInterceptorAdapter)
第二种方法时实现Spring中的WebRequestInterceptor接口或继承实现了WebRequestInterceptor接口类
Interceptor(拦截器)的使用场景
日志记录:
记录请求信息的日志
方便进行信息监控、信息统计、计算 PV(Page View)等;
权限检查:
如登录检测,进入处理器检测是否登录;
性能监控:
通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
通用行为:
读取Cookie得到用户信息并将用户对象放入请求
从而方便后续流程使用
还有如提取 Locale、Theme信息等
只要是多个处理器都需要的即可使用拦截器实现。
例
第一步:创建拦截器类
创建拦截器类
让其实现handlerIntercepter接口
在其preHandle()方法中作拦截判断
注意事项:
该方法返回true表示不拦截继续往下执行
返回false表示拦截不再往下执行
public class LoginHandler implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("user");
if(user == null){
//没有登录
System.out.println("没有登录");
response.sendRedirect(request.getContextPath()+"/user/openLogin");
return false;
}else {
//已经登录
System.out.println("已经登录");
return true;
}
}
}
HandlerInterceptor中定义了如下三个默认方法 preHandle:在Action执行前调用 postHandle:在Action执行后调用,生成视图前调用 afterCompletion:在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
第二步:创建配置类
创建配置类
让其实现WebMvcConfigurer接口
在其addInterceptors()方法中对1中创建的拦截器进行配置
@Configuration
public class java265MvcConfigure implements WebMvcConfigurer {
/**
* 拦截器配置
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册Interceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new LoginHandler());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns( //添加不拦截路径
"/user/openLogin", //登录页面
"/user/login", //登录请求
"/**/*.html", //html静态资源
"/**/*.js", //js静态资源
"/**/*.css" //css静态资源
);
}
}
第三步:
定义用户登录和退出登录的控制器
@Controller
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
/**
* 打开登录页面
*/
@GetMapping("/openLogin")
public String openLogin(){
return "frontend/login";
}
/**
* 登录
*/
@PostMapping("/login")
public String login(String username,String password, HttpSession session){
User user = userService.getUserByUsernameAndPassword(username , password);
if (user == null) {
// 登录失败,打开登录页面
return "frontend/login";
}else {
//登录成功,将用户信息保存到Session中,打开首页
session.setAttribute("user",pageBean.getResult().get(0));
return "redirect:/index";//重定向
}
}
/**
* 退出登录
*/
@ResponseBody
@GetMapping("/logout")
String logout(HttpSession session){
session.removeAttribute("user");
return "success";
}
}
第四步:
测试
启动项目,请求首页localhost/java265/index,发现直接打开登录页面
在登录页面中登录,成功后进入首页
请求localhost/java265/user/logout,退出登录
再次请求登录页面发现又会打开登录页面
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


