1、webx的请求URL和springboot/springmvc不同问题;
如下图为webx的URL的请求处理过程,springboot中的请求路径通过RequestMapping,GetMapping,PostMapping等的注解显示配置,并一目了然,显示可见的,其中产生了两个问题。
- 对应URL迁移到新springboot比较繁琐,且web对与url的访问支持多种方式,例如使用/shop/batch_buy和/shop/batchBuy都能匹配到Shop.java同一个方法,对迁移带来很大困难。
- 对应的URL请求时可以携带action用于前期处理,springboot并不支持,升级需要提供其他方案。
a、关于url的升级问题没有什么好的方法,只能通过对应java类的路径+方法,默认加入到springboot中,通过原有系统前端页面中的请求测试新系统url。
b、对于同一个请求不同处理问题,目前可以通过两种方案解决。如下图第一个请求在springboot中可以配置:@RequestMapping(value="/mywebx/login.htm") ,以下以该配置作用在login()方法上为例讲述。
具体的参考:https://www.iteye.com/blog/tom-seed-2248096
webx中对应的Login.java代码可以通过controller,但是对应的LoginController.java在springboot的流程中无法实现自动查找对应的前期处理,springboot升级必须满足前期处理action逻辑,并实现可扩展。
升级方案一:将LoginController.java提出一个接口,扩展的action作为一个组件并都实现该接口,并使用loginController作为组件名称,在对应的login()方法最顶部通过策略模式调用组件方法.
升级方案二:使用多个方法,请求的ULR相同但增加params配置,具体如下
a、@RequestMapping(value="/mywebx/login.htm") 在方法中不含LoginController代码实现。
b、@RequestMapping(value="/mywebx/login.htm",params="action=LoginController") 在方法中包含LoginController代码实现。
2、webx的webx-channel.xml对应的默认配置
webx系统在URL无法匹配到对应的controller时,依然可以通过默认的处理方案,webx-channel.xml 中配置的流程就是实现该功能的。该流程可以返回json数据,也可以获取远程页面资源在本地吐出。
springboot中并不存在默认的URL处理器,但springboot可以通过容器获取到所有配置的url,所有突破口在这里,以获取外部页面资源为例,具体实现如下。
1、实现一个ChannelController 用于处理默认的处理逻辑 代码可以如下 url =/channel 后续需要用到
@Controller
@Slf4j
public class ChannelController {
@Autowired
HttpServletRequest httpRequest ;
@RequestMapping(value="/channel")
public ResponseEntity<byte[]> getResource(Stirng url) {
byte[] content = "获取远程url对应的vm,HTML,或者jsp资源";
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.TEXT_HTML);
return new ResponseEntity<>(content, headers, HttpStatus.OK);
}
2、实现一个filter 用于匹配请求过来的URL代码如下
@Component
@Order(2)
public class ResourceUrlFilter implements Filter{
@Autowired
private RequestMappingHandlerMapping mapping;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest)request;
Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();
boolean isMatch=false;
for (RequestMappingInfo info : map.keySet()) {
// 获取url的Set集合,一个方法可能对应多个url
if(info.getPatternsCondition().getMatchingCondition(httpRequest)!=null) {
isMatch=true;
break ;
}
}
//根据请求参数获取对应的外部Url
String url ="根据请求参数获取对应的外部Url";
if(!isMatch) {
httpRequest.getRequestDispatcher("/channel?url="url).forward(request,response);
return ;
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}