千家信息网

java SpringBoot拦截器如何使用

发表于:2024-11-29 作者:千家信息网编辑
千家信息网最后更新 2024年11月29日,本篇内容主要讲解"java SpringBoot拦截器如何使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"java SpringBoot拦截器如何使用"
千家信息网最后更新 2024年11月29日java SpringBoot拦截器如何使用

本篇内容主要讲解"java SpringBoot拦截器如何使用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"java SpringBoot拦截器如何使用"吧!

我们对拦截器并不陌生,无论是 Struts 2 还是 Spring MVC 中都提供了拦截器功能,它可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能上。Spring Boot 同样提供了拦截器功能。

在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:

  1. 定义拦截器

  2. 注册拦截器

  3. 指定拦截规则(如果是拦截所有,静态资源也会被拦截)

定义拦截器

在 Spring Boot 中定义拦截器十分的简单,只需要创建一个拦截器类,并实现 HandlerInterceptor 接口即可。

HandlerInterceptor 接口中定义以下 3 个方法,如下表。

返回值类型方法声明描述
booleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
voidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。
voidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。

示例1

以 spring-boot-adminex 项目为例,在 net.biancheng.www.componet 中创建一个名为 LoginInterceptor 的拦截器类,对登陆进行拦截,代码如下。

package net.biancheng.www.componet;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;@Slf4jpublic 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 {        Object loginUser = request.getSession().getAttribute("loginUser");        if (loginUser == null) {            //未登录,返回登陆页            request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");            request.getRequestDispatcher("/index.html").forward(request, response);            return false;        } else {            //放行            return true;        }    }    /**     * 目标方法执行后     *     * @param request     * @param response     * @param handler     * @param modelAndView     * @throws Exception     */    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        log.info("postHandle执行{}", modelAndView);    }    /**     * 页面渲染后     *     * @param request     * @param response     * @param handler     * @param ex     * @throws Exception     */    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        log.info("afterCompletion执行异常{}", ex);    }}

注册拦截器

创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法,并在该方法中调用 registry.addInterceptor() 方法将自定义的拦截器注册到容器中。

示例 2

在配置类 MyMvcConfig 中,添加以下方法注册拦截器,代码如下。

@Configurationpublic class MyMvcConfig implements WebMvcConfigurer {    ......    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new LoginInterceptor());    }}

指定拦截规则

在使用 registry.addInterceptor() 方法将拦截器注册到容器中后,我们便可以继续指定拦截器的拦截规则了,代码如下。

@Slf4j@Configurationpublic class MyConfig implements WebMvcConfigurer {    ......    @Override    public void addInterceptors(InterceptorRegistry registry) {        log.info("注册拦截器");        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**") //拦截所有请求,包括静态资源文件                .excludePathPatterns("/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"); //放行登录页,登陆操作,静态资源    }}

在指定拦截器拦截规则时,调用了两个方法,这两个方法的说明如下:

  • addPathPatterns:该方法用于指定拦截路径,例如拦截路径为"/**",表示拦截所有请求,包括对静态资源的请求。

  • excludePathPatterns:该方法用于排除拦截路径,即指定不需要被拦截器拦截的请求。

至此,拦截器的基本功能已经完成,接下来,我们先实现 spring-boot-adminex 的登陆功能,为验证登陆拦截做准备。

实现登陆功能

1. 将 AdminEx 模板中的 main.html 移动到 src/main/resources/templates 中,结构如下图。

图1:main 页面

2. 在 net.bianheng.www.controller 中创建一个 LoginController, 并在其中添加处理登陆请求的方法 doLogin(),代码如下。

package net.biancheng.www.controller;import lombok.extern.slf4j.Slf4j;import net.biancheng.www.bean.User;import org.springframework.stereotype.Controller;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;import java.util.Map;@Slf4j@Controllerpublic class LoginController {    @RequestMapping("/user/login")    public String doLogin(User user, Map map, HttpSession session) {        if (user != null && StringUtils.hasText(user.getUsername()) && "123456".equals(user.getPassword())) {            session.setAttribute("loginUser", user);            log.info("登陆成功,用户名:" + user.getUsername());            //防止重复提交使用重定向            return "redirect:/main.html";        } else {            map.put("msg", "用户名或密码错误");            log.error("登陆失败");            return "login";        }    }/*    @RequestMapping("/main.html")    public String mainPage(){        return "main";    }*/}

3. 在配置类 MyMvcConfig 中添加视图映射,代码如下。

@Configurationpublic class MyMvcConfig implements WebMvcConfigurer {    @Override    public void addViewControllers(ViewControllerRegistry registry) {        //当访问 "/" 或 "/index.html" 时,都直接跳转到登陆页面        registry.addViewController("/").setViewName("login");        registry.addViewController("/index.html").setViewName("login");        //添加视图映射 main.html 指向  dashboard.html        registry.addViewController("/main.html").setViewName("main");    }    ......}

4. 在 login.html 适当位置添加以下代码,显示错误信息。

验证登陆及登陆拦截功能

1. 启动 Spring Boot,在未登录的情况下,直接通过"http://localhost:8080/main.html"访问主页,结果如下图。

图1:登陆被拦截

2. 在登陆页用户名和密码输入框内分别输入 "admin"和"admin123",点击下方的登陆按钮,结果如下图。

图2:登陆失败

3. 在登陆页用户名和密码输入框内分别输入 "admin"和"123456",点击下方的登陆按钮,结果如下图。

图3:登陆成功

到此,相信大家对"java SpringBoot拦截器如何使用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

拦截器 登陆 方法 功能 代码 视图 资源 用户 用户名 规则 静态 处理 输入 密码 接口 结果 路径 页面 登录 配置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 安卓软件开发试卷 全球基础软件开发公司 网络技术发展简析 网络安全宣传月知识竞赛 大连金骋软件开发有限公司面试 网络安全法可以在境外使用吗 网络安全风险控制要点 php添加数据库文件路径 树莓派3 搭建服务器 关于服务器安全方面 上海计算机软件开发总公司 hp服务器自动关机 北京云核网络技术有限公司官网 入库单数据库设计 软件开发工程师应聘PPT 金融网络安全应对措施及建议 我的世界pe自制服务器 软件开发工资为什么都高 湛江电商软件开发方案 有40岁还在做软件开发的吗 浪潮服务器激活管理口 数据库导出excel为空值 无锡市网络安全产业发展报告 徐州企业软件开发常见问题 orcal数据库驱动下载 我的世界监狱服务器怎么建 数据库编程与软件开发哪个好 CSGO服务器炸掉的原因 网络安全与文明上网主题班会 画网络安全手抄报要写的字
0