我有一个 Spring MVC 注释驱动的项目,它运行良好。在这一点上,我的许多表单都很小,我倾向于使用 Ajax 请求来处理它们。我一直在使用这个插件: http: //jquery.malsup.com/form/来处理我的 Ajax 请求,它也一直运行良好。我遇到了一个问题。我正在使用 Jackson 将我的 @ResponseBody 项目序列化为 json。它工作得很好,但我遇到了需要上传文件的第一个表单。AjaxForm 在较旧的浏览器上使用 iframe 提交技巧来处理这个问题,但警告说有必要用<textarea></textarea>
以确保所有信息都顺利到达。我一直在疯狂地环顾四周,我发现我可以为我的对象制作一个自定义序列化程序,但我想不出这将如何让我检查请求类型是否是XHR
,然后才用<textarea></textarea>
标签包围响应。有任何想法吗?
这是我的一些代码:
public @ResponseBody
JsonResponse setReferenceNumber(@ModelAttribute("referenceNumber")
@Valid ReferenceNumberBean referenceNumber,
BindingResult result,
HttpServletResponse response)
{
//Do some stuff
//Theoretically here I would call upon some logic to surround the response?
return jsonResponse;
}
提前致谢!
更新——我几乎认为我已经解决了这个问题,特别是通过在 Spring 中添加一个新的拦截器:
<mvc:interceptors>
<bean class="edge.portal.vendor.web.interceptor.MultipartAjaxInterceptor"></bean>
</mvc:interceptors>
然后进行拦截器测试以查看 X-Requested-with,然后添加标签,如果我的 javascript 已将调用标记为 Ajax 但标头未反映此更改,因此暗示 iframe ajax 帖子:
@Component
public class MultipartAjaxInterceptor extends HandlerInterceptorAdapter
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
response.getWriter().write("<textarea>");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
if(request.getParameter("isAjax") != null && request.getHeader("X-Requested-With") == null)
response.getWriter().write("</textarea>");
}
}
现在显然我遇到的问题是你不能多次调用响应的 getWriter 或 OutputStream,我觉得我在解决这个问题的正确轨道上,但不知道从哪里开始。