谷粒商城实战-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并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red