当前位置: 代码网 > it编程>编程语言>Java > SpringBoot项目中改变web服务的路径的两种方案

SpringBoot项目中改变web服务的路径的两种方案

2024年08月28日 Java 我要评论
背景:之前是spring项目,增加了servlet,对应非访问路径如/defa/inner-invoke/operator。现在改造成了springboot项目后,默认路径是/oprator希望不改动

背景:

之前是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 {
 
    @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/**");
    }
}

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

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);
 
            // 在服务器端内部转发请求
            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 {
 
    @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服务路径的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com