SpringBoot中如何基于拦截器实现登录验证呢?

戚薇 SpringBoot 发布时间:2023-05-08 10:50:27 阅读数:18760 1
下文笔者讲述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,退出登录
   再次请求登录页面发现又会打开登录页面
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202305/6384.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者