当前位置: 首页 > news >正文

怎么制作糖葫芦教程商丘搜索引擎优化

怎么制作糖葫芦教程,商丘搜索引擎优化,免费建立单位的网站,网站页面开发流程由于项目需要使用拦截器对请求参数进行操作,可是请求流只能操作一次,导致后面方法不能再获取流了。 新建SpringBoot项目 1. 新建拦截器WebConfig.java /*** date: 2023/2/6 11:21* author: zhouzhaodong* description:*/ Configuration public class W…

由于项目需要使用拦截器对请求参数进行操作,可是请求流只能操作一次,导致后面方法不能再获取流了。

新建SpringBoot项目

1. 新建拦截器WebConfig.java

/*** @date: 2023/2/6 11:21* @author: zhouzhaodong* @description:*/
@Configuration
public class WebConfig implements WebMvcConfigurer {/*** 添加Web项目的拦截器*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截// 放行登录页,登陆操作,静态资源registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**");}
}

2. 获取请求参数并处理逻辑

/*** @date: 2023/2/6 12:46* @author: zhouzhaodong* @description: 获取请求参数并处理*/
public class RequestWrapper extends HttpServletRequestWrapper {private final Logger logger = LoggerFactory.getLogger(RequestWrapper.class);private final byte[] body;public RequestWrapper(HttpServletRequest request) {super(request);String sessionStream = getBodyString(request);body = sessionStream.getBytes(StandardCharsets.UTF_8);}public String getBodyString() {return new String(body, StandardCharsets.UTF_8);}/*** @date: 2023/2/6 12:46* @author: zhouzhaodong* @description: 获取请求Body*/public String getBodyString(final ServletRequest request) {StringBuilder sb = new StringBuilder();InputStream inputStream = null;BufferedReader reader = null;try {inputStream = cloneInputStream(request.getInputStream());reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));String line = "";while ((line = reader.readLine()) != null) {sb.append(line);}} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}logger.info("获取body请求参数:" + sb);return sb.toString();}/*** @date: 2023/2/6 12:46* @author: zhouzhaodong* @description: 复制输入流*/public InputStream cloneInputStream(ServletInputStream inputStream) {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;try {while ((len = inputStream.read(buffer)) > -1) {byteArrayOutputStream.write(buffer, 0, len);}byteArrayOutputStream.flush();} catch (IOException e) {e.printStackTrace();}return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());}@Overridepublic BufferedReader getReader() {return new BufferedReader(new InputStreamReader(getInputStream()));}@Overridepublic ServletInputStream getInputStream() {final ByteArrayInputStream bais = new ByteArrayInputStream(body);return new ServletInputStream() {@Overridepublic int read() {return bais.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}};}
}

3. 实现HandlerInterceptor接口

/*** @date: 2023/2/6 11:19* @author: zhouzhaodong* @description: 实现HandlerInterceptor接口*/public class MyInterceptor implements HandlerInterceptor {private final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);/*** @date: 2023/2/6 11:19* @author: zhouzhaodong* @description: 访问控制器方法前执行*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {logger.info("================进入拦截器======================");logger.info(new Date() + "--preHandle:" + request.getRequestURL());logger.info("***************************【RequestBeginning】***************************");logger.info("----------------StartProcessingRequest----------------");try {long currentTime = System.currentTimeMillis();SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");Date date = new Date(currentTime);logger.info("CurrentTime: {}", formatter.format(date));logger.info("ResponseTime: {}", (System.currentTimeMillis() - currentTime) + "ms");String requestUrl = request.getRequestURI();logger.info("RequestURL: {} ", requestUrl);logger.info("GetMethod: {}", handler);String method = request.getMethod();logger.info("Method: {}", method);//获取请求参数RequestWrapper requestWrapper = new RequestWrapper(request);//这里getBodyString()方法无参数logger.info("RequestBody: {}", requestWrapper.getBodyString());} catch (Exception e) {logger.error("MVC业务处理-拦截器异常:", e);}logger.info("-------------------------End-------------------------");return true;}/*** @date: 2023/2/6 12:46* @author: zhouzhaodong* @description: 访问控制器方法后执行*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {logger.info(new Date() + "--postHandle:" + request.getRequestURL());}/*** @date: 2023/2/6 12:46* @author: zhouzhaodong* @description: postHandle方法执行完成后执行,一般用于释放资源*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {logger.info(new Date() + "--afterCompletion:" + request.getRequestURL());}
}

4. application.yml

spring:main:# 当出现相同名字的类进行注册时,准许覆盖注册allow-bean-definition-overriding: true

5. 启动类添加@ServletComponentScan注解

6. 新建TestController.java

/*** @date: 2023/2/6 12:24* @author: zhouzhaodong* @description: 测试*/
@RestController
public class TestController {@PostMapping("/one/abc")public String abc(@RequestBody User user){return user.getName();}
}

7. 不进行处理先测试看结果

请求结果:
在这里插入图片描述

控制台输出:
在这里插入图片描述

可以看出,流被读取了一次然后后台就获取不到了。

8. 通过过滤器获取参数然后传到后面程序中

/*** @date: 2023/2/6 12:47* @author: zhouzhaodong* @description:*/
@Component
@WebFilter(urlPatterns = "/*", filterName = "channelFilter")
public class ChannelFilter implements Filter {private final Logger logger = LoggerFactory.getLogger(ChannelFilter.class);@Overridepublic void init(FilterConfig filterConfig) {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {logger.info("================进入过滤器======================");// 防止流读取一次后就没有了, 所以需要将流继续写出去HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);filterChain.doFilter(requestWrapper, servletResponse);}@Overridepublic void destroy() {}
}

9. 流处理后再进行测试

请求结果:
在这里插入图片描述
控制台输出:
在这里插入图片描述

解决啦!!!

源代码路径

https://github.com/zhouzhaodong/springboot/tree/master/springboot-interceptor

http://www.hkea.cn/news/709842/

相关文章:

  • 网站开发服务费企业网站建设的一般要素
  • 台州企业网站制作公司郴州网站推广
  • 如何做移动端网站邮件营销
  • 网站制作佛山crm管理系统
  • 网站综合营销方案设计网页设计教程
  • 东莞做网站制作宁波技术好的企业网站制作
  • 广州做网站公司哪家好如何注册一个网站
  • 网站备案协议书互联网营销师证书含金量
  • 广州企业网站建设报价免费推广网站大全
  • 宁波网站排名怎么提交网址让百度收录
  • 杭州 手机网站建设活动营销
  • 加网络网站建设工作室做一个企业网站大概需要多少钱
  • 张家港优化网站seo百度网盘下载
  • 烟台有没有做网站网站安全
  • 网站建设与制作设计公司惠州seo代理商
  • 东营新闻网今日头条常州网站seo
  • 东莞全网合一网站黄页引流推广网站软件免费
  • wordpress的数据库在那里百度seo如何快速排名
  • wordpress手机客服代码免费seo快速排名工具
  • web网站开发作品关键词歌词图片
  • 汕头行业网站seo培训公司
  • 网站背景图片优化关键词歌曲免费听
  • 郑州做网站哪家专业我要发布信息
  • 西安做网站优化的公司石家庄seo按天扣费
  • 2022年西安封城通知自动app优化下载
  • 无锡做网站哪家公司好一个公司可以做几个百度推广
  • 专题网站建设工作关键词林俊杰无损下载
  • adobe 网站开发软件软文写作兼职
  • 英文网站建设 淮安免费培训网站
  • 隔离需要多少钱湖南网站seo找行者seo