开发者社区> 问答> 正文

jboot集成undertow不能解析jsp? 400 报错

jboot集成undertow不能解析jsp? 400 报错

项目框架用的是jboot,项目中用到ueditor,但是发现ueditor中的controller.jsp不解析,造成ueditor中图片无法上传。公司之前的项目一直在用ueditor,但是框架是用的jfinal,容器用的jetty/tomcat,ueditor未报错。

项目中在编辑器初始化的时候,ueditor.js需要请求ueditor中的controller.jsp获取ueditor的配置文件等信息。但是controller.jsp未能正确响应,编辑器报错:“后台配置项错,上传功能将无法使用”。尝试直接访问ueditor的controller.jsp,直接变成文件下载了,下载的就是这个controller.jsp。尝试引入undertow-jsp和jastow的jar包,仍然无法解析jsp文件。现在问题定位就是jsp文件没有正常解析,这个问题该怎样解决?

图1:,红色框内是ueditor请求的controller.jsp,返回的不是ueditor配置文件,而是这个jsp文件,所以有下面的错误。

浏览器请求这个controller.jsp响应如下,图2

我尝试的解决办法

1、引入undertow的jsp文件解析的jar包undertow-jsp、jastow,仍然无法解析

2、接管controller.jsp,自己实现一个action来接管ueditor.js的请求,但是发现该controller仅仅是转发,事实上会有好几个action,工程太大,不太好实现,所以放弃了。

这个问题,该怎样解决?

 

展开
收起
爱吃鱼的程序员 2020-06-05 13:07:06 755 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    这像是路由问题

    ######路由应该是没问题的,我把ueditor.all.js访问的地址粘贴出来直接访问,结果是把controller.jsp下载下来了。红色框内 就是 ueditor.all.js访问的路径######

    ueditor 里的jsp代码很简单,建议你用一个Controller来代替一下,同时 JFinal 已经有对应的方案,无需引入 ueditor 的jar包,可以自己百度下。

     

    ######

    下面给出 jfinal 俱乐部项目中的在 UploadController 中直接接管文件上传的代码,同时也不需要 ueditor 的 jar 包:

    /**
    	 * 接管 ueditor 上传图片服务端
    	 *
    	 * 1:该 action 与 ueditor.config.js 中的 serverUrl: "/upload/ueditor" 对应
    	 *
    	 * 2:ueditor 页面加载时会向后端发送 "/xxx?action=config 请求用来获取服务端
    	 *    /ueditor-home/jsp/config.json 中的配置,后续的上传将受该配置的影响
    	 *
    	 * 3:ueditor1_4_3_2-utf8-jsp 版本测试上传图片成功所返回的 json 数据格式如下:
    	 *  {
    	 *     "state": "SUCCESS",
    	 *     "title": "1461249851191086496.png",
    	 *     "original": "qr.png",
    	 *     "type": ".png",
    	 *     "url": "/ueditor/jsp/upload/image/20160421/1461249851191086496.png",
    	 *     "size": "58640"
    	 *  }
    	 *
    	 * 4:如果上传出现错误,直接响应如下的 json 即可:
    	 *    {"state": "错误信息"}
    	 *
    	 */
    	public void ueditor() {
    		/**
    		 * ueditor 在页面加载时会向后端请求获取 config.json 内容
    		 */
    		if ("config".equals(getPara("action"))) {
    			render("/assets/ueditor/jsp/config.json");
    			return;
    		}
    		/**
    		 * 对应 config.json 配置的 imageActionName: "uploadimage"
    		 */
    		if ( ! "uploadimage".equals(getPara("action"))) {
    			renderJson("state", "UploadController 只支持图片类型的文件上传");
    			return ;
    		}
    		/**
    		 * uploadType 是通过如代码令 ueditor 在上传图片时通过问号挂参的方式传递过来的自定义参数
    		 * ue.ready(function() {
    		 *      ue.execCommand('serverparam', {
    		 *          'uploadType': 'project'
    		 *      });
    		 * });
    		 */
    		String uploadType = getPara("uploadType");
    		if (StrKit.isBlank(uploadType)) {
    			renderJson("state", "上传类型参数缺失");
    			return ;
    		}
    
    		if (notLogin()) {
    			renderJson("state", "只有登录用户才可以上传文件");
    			return ;
    		}
    
    		UploadFile uploadFile = null;
    		try {
    			// "upfile" 来自 config.json 中的 imageFieldName 配置项
    			uploadFile = getFile("upfile", UploadService.uploadTempPath, UploadService.imageMaxSize);
    			Ret ret = srv.ueditorUpload(getLoginAccount(), uploadType, uploadFile);
    			// renderJson(ret);
    			render(new JsonRender(ret).forIE());	// 防止 IE 下出现文件下载现象
    		}
    		catch(com.jfinal.upload.ExceededSizeException ex) {
    			renderJson("state", "上传图片只允许 200K 大小");
    		}
    		catch(Exception e) {
    			if (uploadFile != null) {
    				uploadFile.getFile().delete();
    			}
    			
    			renderJson("state", "上传图片出现未知异常,请告知管理员:" + e.getMessage());
    			LogKit.error(e.getMessage(), e);
    		}
    	}

        关键在于前面的几个判断,根据 ueditor js 中的不同请求,render 不同的数据过去即可接管,正式的上传请求通过  getFile() 即可接管,注意这个是 UploadController extends Cotroller 中的代码。

        如果实在搞不定,只能建议你加入俱乐部了:http://www.jfinal.com/club

    ######感谢波总,解决了
    2020-06-05 13:07:23
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像