谷粒商城实战-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

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Java服务实现开启Debug远程调试

《Java服务实现开启Debug远程调试》文章介绍如何通过JVM参数开启Java服务远程调试,便于在线上排查问题,在IDEA中配置客户端连接,实现无需频繁部署的调试,提升效率... 目录一、背景二、相关图示说明三、具体操作步骤1、服务端配置2、客户端配置总结一、背景日常项目中,通常我们的代码都是部署到远程

90%的人第一步就错了! 顺利登录wifi路由器后台的技巧

《90%的人第一步就错了!顺利登录wifi路由器后台的技巧》登录Wi-Fi路由器,其实就是进入它的后台管理页面,很多朋友不知道该怎么进入路由器后台设置,感兴趣的朋友可以花3分钟了解一下... 你是不是也遇到过这种情况:家里网速突然变慢、想改WiFi密码却不知道从哪进路由器、新装宽带后完全不知道怎么设置?别慌

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版