webx框架升级springboot遇到的问题及解决方案

1、webx的请求URL和springboot/springmvc不同问题;

如下图为webx的URL的请求处理过程,springboot中的请求路径通过RequestMapping,GetMapping,PostMapping等的注解显示配置,并一目了然,显示可见的,其中产生了两个问题。

  1. 对应URL迁移到新springboot比较繁琐,且web对与url的访问支持多种方式,例如使用/shop/batch_buy和/shop/batchBuy都能匹配到Shop.java同一个方法,对迁移带来很大困难。
  2. 对应的URL请求时可以携带action用于前期处理,springboot并不支持,升级需要提供其他方案。

a、关于url的升级问题没有什么好的方法,只能通过对应java类的路径+方法,默认加入到springboot中,通过原有系统前端页面中的请求测试新系统url。

b、对于同一个请求不同处理问题,目前可以通过两种方案解决。如下图第一个请求在springboot中可以配置:@RequestMapping(value="/mywebx/login.htm") ,以下以该配置作用在login()方法上为例讲述。

webx框架升级springboot遇到的问题及解决方案_第1张图片

具体的参考: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 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 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() {

    }
}

 

你可能感兴趣的:(springboot,webx)