背景:
之前是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服务路径的资料请关注代码网其它相关文章!
发表评论