最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項目中改變web服務的路徑的兩種方案

 更新時間:2024年08月28日 11:58:43   作者:秋天下著雨  
這篇文章主要介紹了SpringBoot項目中改變web服務的路徑的兩種方案,通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下

背景:

之前是spring項目,增加了servlet,對應非訪問路徑如/defA/inner-invoke/operator。

現(xiàn)在改造成了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 -->

方案一、統(tǒng)一增加前綴并增加攔截

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 {
 
    @Autowired
    private SessionManagerInterceptor sessionManagerInterceptor;
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
 
 
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.addPathPrefix("/defA/inner-invoke", c -> c.isAnnotationPresent(Controller.class) || c.isAnnotationPresent(RestController.class));
    }
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(sessionManagerInterceptor)
                .addPathPatterns("/defA/inner-invoke/**");
 
        registry.addInterceptor(loginCheckInterceptor)
                .addPathPatterns("/defA/inner-invoke/**");
    }
}

方案二:增加攔截器,然后服務器內部增加請求轉發(fā)

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 {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 獲取原始請求路徑
        String originalPath = request.getRequestURI();
 
        // 檢查請求路徑并決定是否需要重定向
        if (originalPath.startsWith("/defA/inner-invoke/")) {
            // 將請求重定向到新的路徑
            String newPath = transformUrl(originalPath);
 
            // 獲取 RequestDispatcher
            RequestDispatcher dispatcher = request.getRequestDispatcher(newPath);
 
            // 在服務器端內部轉發(fā)請求
            dispatcher.forward(request, response);
 
            // 返回 false 表示請求已被處理,不再繼續(xù)
            return false;
        }
 
        // 如果不需要重定向,則繼續(xù)處理請求
        return true;
    }
 
    private String transformUrl(String currentUrl) {
        // 這里實現(xiàn)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 {
 
    @Autowired
    private MvcRequestInterceptor mvcRequestInterceptor;
    @Autowired
    private SessionManagerInterceptor sessionManagerInterceptor;
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
 
    @Override
    public 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");
	}
}

以上就是SpringBoot項目中改變web服務的路徑的兩種方案的詳細內容,更多關于SpringBoot改變web服務路徑的資料請關注腳本之家其它相關文章!

相關文章

  • Spring循環(huán)依賴產(chǎn)生與解決

    Spring循環(huán)依賴產(chǎn)生與解決

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進行一下小小的回顧
    2022-12-12
  • Java實現(xiàn)將Object轉換成指定Class對象的操作代碼

    Java實現(xiàn)將Object轉換成指定Class對象的操作代碼

    這篇文章主要介紹了Java實現(xiàn)將Object轉換成指定Class對象的操作,在Java中,將Object轉換為指定類型的Class對象實際上是兩個不同概念的操作,由于你提到的“將Object轉換成指定Class對象”可能有些混淆,我將分別展示這兩種操作的示例代碼,需要的朋友可以參考下
    2024-09-09
  • maven 打包時間戳問題

    maven 打包時間戳問題

    這篇文章主要介紹了maven 打包時間戳問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • Java數(shù)據(jù)結構之雙端鏈表原理與實現(xiàn)方法

    Java數(shù)據(jù)結構之雙端鏈表原理與實現(xiàn)方法

    這篇文章主要介紹了Java數(shù)據(jù)結構之雙端鏈表原理與實現(xiàn)方法,簡單描述了雙端鏈表的概念、原理并結合實例形式分析了java實現(xiàn)雙端鏈表的相關操作技巧,需要的朋友可以參考下
    2017-10-10
  • java及C++中傳值傳遞、引用傳遞和指針方式的理解

    java及C++中傳值傳遞、引用傳遞和指針方式的理解

    為什么 Java 只有值傳遞,但 C++ 既有值傳遞,又有引用傳遞呢?今天我們就來探討下這個問題,有需要的朋友可以參考下
    2014-09-09
  • java仿QQ微信聊天室功能的實現(xiàn)

    java仿QQ微信聊天室功能的實現(xiàn)

    這篇文章主要介紹了java仿QQ微信聊天室的實現(xiàn)代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,,需要的朋友可以參考下
    2021-04-04
  • java中的動態(tài)代理與責任鏈模式詳解

    java中的動態(tài)代理與責任鏈模式詳解

    這篇文章主要介紹了java中的動態(tài)代理與責任鏈模式詳解,動態(tài)代理提供了一種靈活且非侵入式的方式,可以對對象的行為進行定制和擴展,它在代碼重用、解耦和業(yè)務邏輯分離、性能優(yōu)化以及系統(tǒng)架構中起到了重要的作用,需要的朋友可以參考下
    2023-08-08
  • SpringBoot+MybatisPlus+jdbc連接池配置多數(shù)據(jù)源的實現(xiàn)

    SpringBoot+MybatisPlus+jdbc連接池配置多數(shù)據(jù)源的實現(xiàn)

    本文主要介紹了SpringBoot+MybatisPlus+jdbc連接池配置多數(shù)據(jù)源的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • Java JSON全解析6種主流方案深度對比與實戰(zhàn)指南

    Java JSON全解析6種主流方案深度對比與實戰(zhàn)指南

    本文介紹了Java中六種主流的JSON解析庫:Jackson、Gson、FastJSON、JsonPath、org.json和手動解析,每種庫都有其適用的場景和特點,文章還提供了每種庫的基礎轉換和高級功能的實戰(zhàn)代碼示例,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • SpringBoot項目熱部署的實現(xiàn)

    SpringBoot項目熱部署的實現(xiàn)

    SpringBoot項目熱部署是一種讓開發(fā)人員在修改代碼后無需重啟應用即可看到更改效果的技術,通過使用SpringBoot的DevTools等工具,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-09-09

最新評論

新巴尔虎左旗| 涡阳县| 苏州市| 曲阜市| 天峻县| 新郑市| 兴文县| 安庆市| 荆门市| 福州市| 洛浦县| 淅川县| 铜陵市| 深泽县| 乐山市| 莒南县| 城口县| 来凤县| 克山县| 舞阳县| 临泽县| 沅陵县| 略阳县| 汝阳县| 城固县| 繁峙县| 天津市| 华池县| 桓台县| 巩义市| 广饶县| 马边| 阿鲁科尔沁旗| 蒲江县| 越西县| 永康市| 天津市| 江华| 佛学| 云龙县| 宣恩县|