springboot项目中如何改变web服务的路径

背景:

之前是spring项目,增加了servlet,对应非访问路径如/defA/inner-invoke/operator。

现在改造成了springboot项目后,默认路径是/oprator

希望不改动原有controller代码,让路径能够增加前缀让外面能正常调用。

原web.xml配置:

  <!-- Web Servlet Configuration --><servlet><servlet-name>stariboss</servlet-name><servlet-class>com.osgi.web.servlet.SpringProxyServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>defA</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>defA</servlet-name><url-pattern>/inner-invoke/*</url-pattern></servlet-mapping><!-- End Web Servlet Configuration -->

方案一、统一增加前缀并增加拦截

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebIntfConfig implements WebMvcConfigurer {@Autowiredprivate SessionManagerInterceptor sessionManagerInterceptor;@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {configurer.addPathPrefix("/defA/inner-invoke", c -> c.isAnnotationPresent(Controller.class) || c.isAnnotationPresent(RestController.class));}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(sessionManagerInterceptor).addPathPatterns("/defA/inner-invoke/**");registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/defA/inner-invoke/**");}
}

方案二:增加拦截器,然后服务器内部增加请求转发

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class MvcRequestInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取原始请求路径String originalPath = request.getRequestURI();// 检查请求路径并决定是否需要重定向if (originalPath.startsWith("/defA/inner-invoke/")) {// 将请求重定向到新的路径String newPath = transformUrl(originalPath);// 获取 RequestDispatcherRequestDispatcher dispatcher = request.getRequestDispatcher(newPath);// 在服务器端内部转发请求dispatcher.forward(request, response);// 返回 false 表示请求已被处理,不再继续return false;}// 如果不需要重定向,则继续处理请求return true;}private String transformUrl(String currentUrl) {// 这里实现URL转换逻辑return currentUrl.replace("/defA/inner-invoke/", "/");}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class IntfInterceptorConfig implements WebMvcConfigurer {@Autowiredprivate MvcRequestInterceptor mvcRequestInterceptor;@Autowiredprivate SessionManagerInterceptor sessionManagerInterceptor;@Autowiredprivate LoginCheckInterceptor loginCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(mvcRequestInterceptor).addPathPatterns("/defA/inner-invoke/**");registry.addInterceptor(sessionManagerInterceptor).addPathPatterns("/**");registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");}
}

增加其他几个拦截器相关代码

@Component
public class SessionManagerInterceptor extends HandlerInterceptorAdapter {private final Log logger = LogFactory.getLog(SessionManagerInterceptor.class);public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {try {preReadRemoteInvocation(request);return true;} finally {preWriteRemoteInvocationResult(response,handler);}}private void preReadRemoteInvocation(HttpServletRequest request) {String sessionId = request.getHeader("sessionId");ApplicationSession appSession =null;if(sessionId!=null && sessionId.length()>0){appSession = getCache().getSession(sessionId);if(appSession == null){if (logger.isWarnEnabled()) {logger.warn("not find session: " + sessionId);}}else{if (logger.isDebugEnabled()) {logger.debug("getSession: " + sessionId);}}}if(appSession==null){appSession = ApplicationSession.create();if (logger.isDebugEnabled()) {logger.debug("create a new Session: " + appSession.getId());}}ApplicationSessionHolder.put(appSession);}private void preWriteRemoteInvocationResult(HttpServletResponse response,Object handler) {ApplicationSession appSession = ApplicationSessionHolder.getApplicationSession();if (appSession != null) {if (ApplicationSessionHolder.isClear() && !"login".equals(((HandlerMethod)handler).getMethod().getName())) {if (logger.isInfoEnabled()) {logger.info("remove cache Session : " + appSession.getId());}getCache().clearSession(appSession.getId());} else {appSession.updateLastAccessedTime();response.setHeader("sessionId", appSession.getId());getCache().putSession(appSession);}
//			ApplicationSessionHolder.remove();}}public ISessionCache getCache() {if (BeanFactoryHolder.getContext().containsBean("proxySessionCache")) {return (ISessionCache) BeanFactoryHolder.getContext().getBean("proxySessionCache");}return (ISessionCache) BeanFactoryHolder.getContext().getBean("sessionCache");}}
package com.star.sms.webconfig;import com.star.sms.business.core.ApplicationSessionHolder;
import com.star.sms.business.core.BeanFactoryHolder;
import com.star.sms.exceptions.BossInnerServiceInvokeException;
import com.star.sms.model.core.ApplicationSession;
import com.star.sms.remote.session.ISessionCache;
import org.apache.commons.lang.ArrayUtils;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class LoginCheckInterceptor extends HandlerInterceptorAdapter {private String[] methods = { "login", "logout", "unlock", "getVersion","getSystemParamInt", "getSession","getSupplyOperatorRecordSwitch" ,"agentLogin"};public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws BossInnerServiceInvokeException {if (!(handler instanceof HandlerMethod)) {return true;}if (!ArrayUtils.contains(methods, ((HandlerMethod)handler).getMethod().getName()) && !isLogin()) {String sessionId = request.getHeader("sessionId");if (StringUtils.hasText(sessionId)) {ApplicationSession session = getCache().getSession(sessionId);if (session == null || session.getAttribute("operator") == null) {throw BossInnerServiceInvokeException.error("not.login");}else{session.updateLastAccessedTime();getCache().putSession(session);ApplicationSessionHolder.put(session);}} else {throw BossInnerServiceInvokeException.error("not.login");}} return true;}public static boolean isLogin() {ApplicationSession session = ApplicationSessionHolder.getApplicationSession();if (session == null) {return false;}Object o = session.getAttribute("operator");return o != null;}public ISessionCache getCache() {if (BeanFactoryHolder.getContext().containsBean("proxySessionCache")) {return (ISessionCache) BeanFactoryHolder.getContext().getBean("proxySessionCache");}return (ISessionCache) BeanFactoryHolder.getContext().getBean("sessionCache");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挑选适合的项目协同软件?看看这10款

文章主要介绍了以下10款项目协同进度软件&#xff1a;1.PingCode&#xff1b;2.Worktile&#xff1b;3.万户OA&#xff1b;4.小步外勤&#xff1b;5.智办事&#xff1b;6.万里牛&#xff1b;7.轻流&#xff1b;8.Toggl Track&#xff1b;9.Trello&#xff1b;10.Todoist。 在如…

【markdown 中的文字颜色设置】按色系分类

文本颜色分类 蓝绿色系:灰色系:蓝紫色系:粉色系:绿色系:橘棕色系:语法,以天蓝色为例: <font color=skyblue>我是文字</font>我是文字 或者 替换成对应的16进制 <font color=#87CEEB>同理</font>同理 接下来是按色系分类的颜色名 蓝绿色系: …

PHP概述-特点-应用领域-如何学习

老师建议注册使用百度文心一言&#xff1b;讯飞星火大模型-AI大语言模型-星火大模型-科大讯飞&#xff1b;Kimi.ai - 帮你看更大的世界 等人工智能工具软件的一个到两个&#xff0c;也可下载文心一言、讯飞星火、kimi等APP软件使用&#xff0c;对于我们在读的大二学生来说有什么…

哪款麦克风音质效果好?一文看懂无线领夹麦克风什么品牌好

说到无线领夹麦克风麦克风&#xff0c;可能有些朋友对这个名字感觉很陌生&#xff0c;但是对于自媒体创作者以及短视频up主而言&#xff0c;应该会更熟悉一些。因为一款好的麦克风是提升音质的关键&#xff0c;而无线领夹麦克风作为一种小巧方便的收音设备&#xff0c;近些年更…

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器 Citrix ADC - 混合多云应用交付控制器 请访问原文链接&#xff1a;https://sysin.org/blog/citrix-adc-13/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…

前端下载时,出现err::netERR_FAULT的报错

场景&#xff1a;文件下载时&#xff0c;前端通过axios请求后台接口&#xff0c;同时将文件的“半链接”传给该接口&#xff0c;此时后台会重定到文件下载的链接&#xff0c;如果文件过大时&#xff0c;部分浏览器则会出现上述报错&#xff0c;导致无法下载 解决方案&#xff…

spring boot(学习笔记第十九课)

spring boot(学习笔记第十九课) Spring boot的batch框架&#xff0c;以及Swagger3(OpenAPI)整合 学习内容&#xff1a; Spring boot的batch框架Spring boot的Swagger3&#xff08;OpenAPI&#xff09;整合 1. Spring boot batch框架 Spring Batch是什么 Spring Batch 是一个…

行为识别实战第二天——Yolov5+SlowFast+deepsort: Action Detection(PytorchVideo)

Yolov5SlowFastdeepsort 一、简介 YoloV5SlowFastDeepSort 是一个结合了目标检测、动作识别和目标跟踪技术的视频处理框架。这一集成系统利用了各自领域中的先进技术&#xff0c;为视频监控、体育分析、人机交互等应用提供了一种强大的解决方案。 1. 组件说明&#xff1a; Y…

51单片机最快能生成多高频率的方波?

前言 在嵌入式系统开发中&#xff0c;51 单片机作为一种非常非常非常经典&#xff0c;贯穿上下几十年的微控制器&#xff0c;被广泛应用于各种电子项目中。其中&#xff0c;生成特定频率的方波信号是一项常见的需求。 那么&#xff0c;51 单片机究竟能以多快的速度生成方波呢&…

postgresql版本升级

从postgresql 12升级至postgresql 14。 同一大版本的小版本无需更新数据目录&#xff0c;直接更新程序目录&#xff0c;但是要注意重新编译安装插件。 个人建议大版本中的小版本更新至5以上再使用&#xff0c;例如发稿时最新稳定版为16.4&#xff0c;建议至16.5以后再考虑升级…

26 colorchooser组件

Tkinter colorchooser 组件使用指南 Tkinter 的 colorchooser 组件提供了一个图形界面&#xff0c;用于选择颜色。它允许用户通过标准的颜色选择对话框来选择颜色&#xff0c;非常适合需要颜色选择功能的GUI应用程序。以下是对 colorchooser 组件的详细说明和一个使用案例。 …

UNI-APP 打包构建 APK

UNI-APP 打包构建 APK 前言一、WINDOWS&#xff08;在线 - 纯命令版&#xff09;依赖其他前置准备实现原理操作步骤 二、WINDOWS&#xff08;离线 - Android Studio 版&#xff09;依赖&#xff08;首次构建需要联网安装依赖&#xff09;其他前置准备实现原理操作步骤 三、WIND…

【Java】Java 设计模式之工厂模式与策略模式

Java设计模式是软件工程中一系列被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结&#xff0c;它们代表了最佳的实践&#xff0c;帮助开发者解决在软件设计过程中遇到的各种问题。这些模式可以根据其用途分为三大类&#xff1a;创建型、结构型和行为型&#xff0…

网络安全的历史

如今&#xff0c;网络安全几乎成为各大公司和利益相关者关注的焦点。但在早期&#xff0c;网络安全的概念非常模糊。 直到多年以后&#xff0c;由于网络攻击和危险实体威胁的频繁发生&#xff0c;网络安全的发展才受到重视。这些措施的发展成为了网络安全的演变。 网络安全起…

el-pagination 下拉条目数最后一个样式改成全部

2024.08.27今天我学习了如何把el-pagination的下拉条目数修改&#xff0c;效果如下&#xff1a; 我们需要把最后一条选择换成全部展示&#xff0c;其实传给后端的还是总的数量&#xff0c;只是换了一个content&#xff0c; 通过f12查看元素可以拿到.el-select-dropdown__item …

创建django项目时遇到的改项目名字问题

问题描述 今天在学习时遇到了一些问题&#xff0c;现记录一下。 今天我利用 ‘django-admin startproject 项目名字’命令创建了一个项目&#xff0c;并觉得当时项目名字没有命好&#xff0c;所以就随性的运行了 ’rename 旧项目名字 新项目名字‘这一命令。但是随后就出现…

使用idea快速创建springbootWeb项目(springboot+springWeb+mybatis-Plus)

idea快速创建springbootWeb项目 详细步骤如下 1&#xff09;创建项目 2&#xff09;选择springboot版本 3&#xff09;添加web依赖 4&#xff09;添加Thymeleaf 5&#xff09;添加lombok依赖 然后点击create进入下一步 双击pom.xml文件 6&#xff09;添加mybatis-plus依赖 …

java.util.Optional.or() .orElse(), .orElseGet()的区别

java.util.Optional 是 Java 8 引入的一个容器类&#xff0c;用于表示一个可能包含或不包含非空值的对象。它提供了多种方法来处理可能为空的对象&#xff0c;从而避免使用null值。 在 Optional 中&#xff0c;.or(), .orElse(), 和 .orElseGet() 都是用于处理可能为空的值的方…

7-10 简单求阶乘问题

本题要求编写程序&#xff0c;计算N的阶乘。 输入格式: 输入在一行中给出一个不超过12的正整数N。 输出格式: 在一行中输出阶乘的值。 输入样例: 4输出样例: 24 #include <stdio.h>int Fac(int x){if(x1) return 1;// 递归出口return x*Fac(x-1);// 递归 } int m…

C_03_函数学习

函数 优点&#xff1a; 降低代码耦合度降低代码冗余度提高代码复用率提高代码可读性 思想&#xff1a; 封装【包装】 声明&#xff1a; 语法&#xff1a; extern 函数名(形参列表)&#xff1b;// 注意&#xff1a;此时 形参列表中变量名可以忽略不写&#xff1b;定义&#xff1…