参考:https://www.jianshu.com/p/69c6fba08c92
原因:
spring拦截器读取body后,controller里面的body就为空了,所以我们要重写request即可。
1、重写RequestWrapper
import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.*;public class RequestWrapper extends HttpServletRequestWrapper {private final String body;public RequestWrapper(HttpServletRequest request) {super(request);StringBuilder stringBuilder = new StringBuilder();BufferedReader bufferedReader = null;InputStream inputStream = null;try {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) {} finally {if (inputStream != null) {try {inputStream.close();}catch (IOException e) {e.printStackTrace();}}if (bufferedReader != null) {try {bufferedReader.close();}catch (IOException e) {e.printStackTrace();}}}body = stringBuilder.toString();}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());ServletInputStream servletInputStream = new ServletInputStream() {@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() throws IOException {return byteArrayInputStream.read();}};return servletInputStream;}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(this.getInputStream()));}public String getBody() {return this.body;}}
2、拦截器使用新request
package com.miniprogram.web.douyin.interceptor;import com.alibaba.fastjson.JSON;import com.miniprogram.api.douyin.user.req.DyuserReq;import com.miniprogram.common.auth.VisitLimitCount;import com.miniprogram.common.cache.RedisCache;import com.miniprogram.common.config.InterceptorConfigMap;import com.miniprogram.common.config.InterceptorUrlConfig;import com.miniprogram.common.douyin.SearchEngineMapConstants;import com.miniprogram.common.response.Response;import com.miniprogram.common.session.*;import com.miniprogram.common.utils.DateUtil;import com.miniprogram.dao.common.UserLoginEntity.Users;import com.miniprogram.service.douyin.users.UsersService;import com.miniprogram.web.douyin.config.RequestWrapper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.BeanUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;@Component("authSecurityInterceptor")public class AuthSecurityInterceptor extends HandlerInterceptorAdapter {private Logger logger = LoggerFactory.getLogger(AuthSecurityInterceptor.class);@Autowiredprivate UsersService douYinUsersService;@Autowiredprivate RedisCache redisCache;@Autowiredprivate VisitLimitCount visitLimitCount;@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {try {RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);String body = requestWrapper.getBody();System.out.println(body);return true;}catch (Exception e){logger.error("权限判断出错",e);}return false;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}}
3、filter替换request
import com.miniprogram.web.douyin.config.RequestWrapper;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import java.io.IOException;@Component@WebFilter(urlPatterns = "/*",filterName = "channelFilter")public class ChannelFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {ServletRequest requestWrapper = null;if(servletRequest instanceof HttpServletRequest) {requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);}if(requestWrapper == null) {filterChain.doFilter(servletRequest, servletResponse);} else {filterChain.doFilter(requestWrapper, servletResponse);}}@Overridepublic void destroy() {}}
4、注册filter
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.servlet.MultipartConfigFactory;import org.springframework.boot.web.servlet.ServletComponentScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;@SpringBootApplication@ServletComponentScan //注册过滤器注解@Configurationpublic class WebApplication {public static void main(String[] args) {SpringApplication.run(WebApplication.class, args);}}
