谷粒商城实战-264-商城业务-订单服务-订单登录拦截

2024-08-26 23:04

本文主要是介绍谷粒商城实战-264-商城业务-订单服务-订单登录拦截,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一,登录检测
  • 二,HandlerInterceptor的原理和用法
      • HandlerInterceptor 接口定义
        • 方法签名
      • 方法用途
      • 使用示例
      • 注册拦截器
      • 总结

一,登录检测

order模块的所有请求,都需要在登录状态下进行,所以要对所有请求进行拦截,校验登录状态。

 @Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String uri = request.getRequestURI();AntPathMatcher antPathMatcher = new AntPathMatcher();boolean match = antPathMatcher.match("/order/order/status/**", uri);boolean match1 = antPathMatcher.match("/payed/notify", uri);if (match || match1) {return true;}//获取登录的用户信息MemberResponseVo attribute = (MemberResponseVo) request.getSession().getAttribute(LOGIN_USER);if (attribute != null) {//把登录后用户的信息放在ThreadLocal里面进行保存loginUser.set(attribute);return true;} else {//未登录,返回登录页面response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<script>alert('请先进行登录,再进行后续操作!');location.href='http://auth.gulimall.com/login.html'</script>");// session.setAttribute("msg", "请先进行登录");// response.sendRedirect("http://auth.gulimall.com/login.html");return false;}}

这段代码是Spring MVC框架中的HandlerInterceptor实现的一部分。preHandle方法在实际的控制器方法执行之前被调用。它的目的是拦截并根据用户是否已登录来控制对某些端点的访问。

下面是逻辑的分解:

  1. URI匹配:

    • 首先检查传入请求的URI是否与以下两个模式之一匹配:
      • /order/order/status/**:这个模式匹配所有以/order/order/status/开头的URL,包括任何额外的路径元素。
      • /payed/notify:这是一个精确匹配的路径/payed/notify
    • 如果URI与这两个模式中的任何一个匹配,则该方法立即返回true,允许请求无需进一步检查即可继续。这些路径似乎是配置为绕过登录要求的。
  2. 用户认证检查:

    • 接下来尝试从会话中获取登录用户的信息,通过获取名为LOGIN_USER的属性。如果用户已经登录,该属性将包含一个表示用户详细信息的MemberResponseVo对象。
    • 如果用户已验证(即attribute不为null),则将用户信息存储在一个名为loginUserThreadLocal变量中。这使得可以在整个应用程序中方便地访问用户数据,而无需显式传递。
    • 之后,该方法返回true,允许请求继续到预定的控制器方法。
  3. 处理未认证用户:

    • 如果用户未验证(即attributenull),则向客户端发送HTTP响应,内容类型设置为text/html;charset=UTF-8
    • 它向响应中写入HTML内容,其中包括JavaScript警告消息以及重定向到登录页面(http://auth.gulimall.com/login.html)。这有效地阻止了请求到达预定的端点,并将用户重定向到登录页面。
    • 最后,该方法返回false,表明请求已被处理且不应进一步继续。

二,HandlerInterceptor的原理和用法

HandlerInterceptor 是 Spring MVC 框架中的一个重要接口,用于在控制器方法执行前后进行拦截操作。通过实现 HandlerInterceptor 接口,开发者可以定义一系列钩子方法来扩展和定制请求处理流程。以下是 HandlerInterceptor 接口的主要原理和用法:

HandlerInterceptor 接口定义

HandlerInterceptor 接口定义了三个方法:

  1. preHandle: 在控制器方法执行之前被调用。
  2. postHandle: 在控制器方法执行之后,但在视图渲染之前被调用。
  3. afterCompletion: 在整个请求处理完成之后被调用,包括视图渲染。
方法签名
  • boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
  • void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
  • void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;

方法用途

  1. preHandle:

    • 这个方法在控制器方法执行前被调用。
    • 如果返回 true,则请求将继续;如果返回 false,则请求将不再继续,并且不会调用控制器方法。
    • 常用于权限验证、记录日志等操作。
  2. postHandle:

    • 这个方法在控制器方法执行后、视图渲染之前被调用。
    • 可以用来修改模型数据或做一些清理工作。
    • 例如,修改视图名称或添加模型数据。
  3. afterCompletion:

    • 这个方法在整个请求完成后被调用。
    • 可以用来释放资源或记录异常。
    • 通常用于关闭数据库连接或其他需要在请求结束后执行的操作。

使用示例

下面是一个简单的使用示例:

public class MyHandlerInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 检查用户是否登录MemberResponseVo member = (MemberResponseVo) request.getSession().getAttribute("LOGIN_USER");if (member != null) {// 用户已登录,可以继续return true;} else {// 用户未登录,重定向到登录页面response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<script>alert('请先进行登录,再进行后续操作!');location.href='http://auth.gulimall.com/login.html'</script>");return false;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 该方法在控制器方法执行后、视图渲染之前调用// 可以在这里做数据清理等工作}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 该方法在整个请求完成后调用// 可以用来释放资源或记录异常}
}

注册拦截器

要让拦截器生效,需要将其注册到 Spring MVC 的配置中。可以通过以下方式之一进行注册:

  1. 使用 XML 配置:

    <mvc:interceptors><bean class="com.example.MyHandlerInterceptor"/>
    </mvc:interceptors>
    
  2. 使用 Java 配置:

    @Configuration
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyHandlerInterceptor());}
    }
    

总结

HandlerInterceptor 提供了一个强大的机制来扩展 Spring MVC 应用程序的功能。通过实现这些方法,你可以轻松地添加诸如身份验证、日志记录、性能监控等功能,而无需修改现有的控制器代码。

这篇关于谷粒商城实战-264-商城业务-订单服务-订单登录拦截的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109939

相关文章

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习