以前公司作了一个项目,须要与app对接。由于作的是通用服务,app那边是须要直接访问的,这样每次请求两边都须要一个凭证来完成一个互相认证的过程。说一下咱们项目采用的方式吧,app那边将请求参数进行必定规则的加密,生成一个sign值,与参数一块儿传递过来,而后后端在拦截器中一样将参数按一样的规则加密,对比sign值是否一致,一致则经过,同理,app那边也是这样的认证过程。讨论好方案以后天然就是开始写代码了。后端
首先天然想到的是经过拦截器蓝完成认证的过程。可是在测试过程当中发现,拦截器都返回true了,却到不了controller层。代码配置什么的都没问题,上网查资料才发现app
request.getInputStream(); request.getReader(); request.getParameter();这些方法都只能被执行一次,再次执行就无效了。思路就是新建一个类A继承HttpServletRequestWrapper并重写getInputStream()方法,而后新建一个过滤器,将servletRequest替换成咱们新建的类A。主要代码以下:ide
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { private final String body; public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); StringBuilder stringBuilder = new StringBuilder(); BufferedReader bufferedReader = null; try { InputStream inputStream = request.getInputStream(); if (inputStream != null) { bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); char[] charBuffer = new char[128]; int bytesRead = -1; while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { stringBuilder.append(charBuffer, 0, bytesRead); } } else { stringBuilder.append(""); } } catch (IOException ex) { throw ex; } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (IOException ex) { throw ex; } } } body = stringBuilder.toString(); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); ServletInputStream servletInputStream = new ServletInputStream() { public int read() throws IOException { return byteArrayInputStream.read(); } }; return servletInputStream; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } public String getBody() { return this.body; } }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ServletRequest requestWrapper = null; if (request instanceof HttpServletRequest) { requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request); } if (null == requestWrapper) { chain.doFilter(request, response); } else { chain.doFilter(requestWrapper, response); } }