- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我的 JSON 网络服务创建一个验证系统。这个想法是让一个拦截器捕获每个 Json @RequestBody
,通过 JacksonMapping
用它创建一个 JSON 对象。然后从中读取 ValidationAnnotations
以检查数据,并在通过时完成常规流程,否则将包含错误消息的模型和 View 图发送回发送方。
知道这个上下文考虑这个
@RequestMapping(value="/rest/contact/list/filter", method = RequestMethod.POST, consumes="application/json", produces="application/json")
public @ResponseBody JsonContactList findFilteredContacts(@RequestBody JsonContactSelectorData selectorData, Model model) throws Exception {
MbaLog.debugLog(logger,"Finding Contacts with selector data: " + selectorData);
JsonContactList result = contactService.findContacts(selectorData);
return result;
}
这是拦截器之前我的 Controller 方法,下面是拦截器
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
ValidationRequestWrapper wrapper = new ValidationRequestWrapper(request);
//do complex validation here
return super.preHandle(wrapper, response, handler);
}
列表中的下一个是请求包装器
public class ValidationRequestWrapper extends HttpServletRequestWrapper {
private String jsonString;
public ValidationRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
jsonString = "";
Scanner scanner = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\\A");
if (scanner.hasNext())
jsonString = scanner.next();
System.out.println("need a break");
}
@Override
public ServletInputStream getInputStream ()
throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(jsonString.getBytes());
ServletInputStream inputStream = new ServletInputStream() {
public int read ()
throws IOException {
return byteArrayInputStream.read();
}
};
return inputStream;
}
}
如您所见,我获取了请求输入流,然后覆盖了 getInputStream()
,这是在这些情况下的习惯做法。在拦截器中,您可以看到我实例化了这个包装器并将其传递给 super.prehandle(...)。我希望然后进入 Controller 并愉快地进一步使用我的 jsonobject。然而结果却很令人失望。
java.io.EOFException: No content to map to Object due to end of input
覆盖的输入流方法似乎没有被调用?还是我的这个机制完全错了?我什至可以使用 HandlerInterceptorAdapter
吗?
最佳答案
我设法弄清楚 HandlerInterceptorAdapter 不可能完成我在问题中请求的功能。
解决这个问题的唯一选择是使用 javax.servlet.Filter
例子
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
InterceptorRequestWrapper myRequestWrapper = new InterceptorRequestWrapper((HttpServletRequest) request);
String httpRequestMethod = ((HttpServletRequest) request).getMethod();
if("POST".equals(httpRequestMethod) || "PUT".equals(httpRequestMethod)){
String body = myRequestWrapper.getBody();
ErrorObject errorObject = new ErrorObject();
errorObject.setSource(body);
Map<String, List<ErrorMessage>> errorMessages = new HashMap<String, List<ErrorMessage>>();
ErrorMessage error = new ErrorMessage();
error.setErrorLabel("myerror");
errorMessages.put("test", Arrays.asList(error));
errorObject.setErrorMessages(errorMessages);
myRequestWrapper.setAttribute("errorObject", errorObject);
}
chain.doFilter(myRequestWrapper, response);
}
关于java - HandlerInterceptorAdapter 似乎没有转发 HttpServletRequestWrapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11890516/
我正在尝试使用 java/jsp 中的过滤器过滤掉名为“reason”的查询参数。 基本上,过滤器的作用是确保用户输入查看页面的“原因”。如果他们没有,则需要将他们重定向到“输入原因”页面。一旦他们输
在我的项目中,我有一组 api 调用,它们应该通过某些常见的验证集进行过滤。在这种情况下,我必须在请求到达 REST Controller 之前拦截请求,读取请求正文,进行验证并在请求通过验证时将其传
我正在尝试为我的 JSON 网络服务创建一个验证系统。这个想法是让一个拦截器捕获每个 Json @RequestBody,通过 JacksonMapping 用它创建一个 JSON 对象。然后从中读取
我有一个过滤器可以验证/授权 REST 调用。此过滤器需要访问请求参数,因此我为此编写了自定义 HTTPServletRequestWrapper。 import java.util.Collecti
我写了一个名为 HTTPRequest 的 HttpServletRequestWrapper,它读取完整的 HTTP POST 主体以供进一步使用。这个基于 http://natch3z.blogs
我有一个标准的 Spring MVC Controller (服务于 REST 调用),如下所示: @Controller public class SpringRestController {
我正在使用从“EAR A”到“EAR B”的编码形式。 当我尝试处理请求时: accion = "/decimprenta"; pagina = "/procesardeclaraci
我用的是Tomcat7。我的项目结构是: as1.jsp as2.jsp web.xml 的内容是: filter1 /as1.jsp
我的要求是解密用我自己的算法加密的请求体。 我尝试扩展 HttpServletRequestWrapper 并将新请求传递给 doFilter。但是 getInputStream 和 getReade
我目前正在使用 Jersey 库在 Java 中开发 RESTful Web 服务。 出于安全原因,我们需要类似于 Amazon 的简单存储服务的自定义身份验证。但是,这需要我计算正文(如果有的话)的
我想在 Servlet 请求中添加自定义 header 。 首先,我构建了一个HttpServletRequestWrapper类 public class HeaderRequest_DEBUG e
我正在尝试调整 HttpServletRequestWrapper(参见 How to read InputStream multiple times),以便在过滤器中使用 HTTP Post 正文后
我正在编写一个 Tomcat 应用程序,并根据 Google 的 oauth2 服务进行身份验证。我原本打算编写一个简单的 Filter 来进行身份验证,但无法在 Filter 中设置用户主体。根据我
我有一个过滤器,它接受传入请求,然后用 HttpServletRequestWrapper 包装它,而 HttpServletRequestWrapper 又具有 setParameter() 方法。
使用 HttpServletRequestWrapper 包装 HttpServletRequest 的目的是什么?我们这样做有什么好处? 最佳答案 HttpServletRequest是 HTTP
我在 Eclipse IDE 中使用 JBoss4.2。当我运行 hellojsf程序使用JSP View 技术,运行良好。当我尝试使用相同组件的 Facelets 时,出现以下异常: 2012-06
我是一名优秀的程序员,十分优秀!