如何從request中獲取body的數(shù)據(jù)
從request中獲取body的數(shù)據(jù)
如果在controller里直接@RequestBody就可以獲取,這種方式很簡單,現(xiàn)在說下直接從request中獲取。
說下場景
我是在shiro的filter中獲取body中的數(shù)據(jù):
@Override public boolean onAccessDenied(ServletRequest servletRequest, ServletResponse response) throws Exception{ log.info("into onAccessDenied"); try { HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; String str = httpServletRequest.getQueryString(); BufferedReader bufferedReader = httpServletRequest.getReader(); String bodyStr = IOUtils.read(bufferedReader); System.out.println("bodyStr = " + bodyStr ); return true; }catch (ExpiredCredentialsException e){ log.info("請求信息過期"); WebUtils.toHttp(response).sendError(401,"請求信息過期,操作失敗"); }catch (Exception e){ log.info("請求參數(shù)不合法"); e.printStackTrace(); WebUtils.toHttp(response).sendError(401,e.getMessage()); } return false; }
這里給出主要的相關(guān)代碼,IOUtils是dubbo的一個類
相關(guān)依賴如下:
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> </dependency>
通過這種方式獲取的是一個json字符串,
bodyStr = { "timestamp":1523966342156 }
因為我項目中沒有用到dubbo,如果為了一個body的解析引入這個感覺有些不太合適,而且啟動的時候也沒有正常啟動,所以我把這塊代碼抽取了出來:
package com.test.shiro.util; import java.io.IOException; import java.io.Reader; import java.io.StringWriter; import java.io.Writer; /** * @author Created by pangkunkun on 2018/4/20. * 這段代碼來自dubbo * */ public class RequestBodyUtils { private static final int BUFFER_SIZE = 1024 * 8; /** * read string. * * @param reader Reader instance. * @return String. * @throws IOException */ public static String read(Reader reader) throws IOException { StringWriter writer = new StringWriter(); try { write(reader, writer); return writer.getBuffer().toString(); } finally{ writer.close(); } } /** * write. * * @param reader Reader. * @param writer Writer. * @return count. * @throws IOException */ public static long write(Reader reader, Writer writer) throws IOException { return write(reader, writer, BUFFER_SIZE); } /** * write. * * @param reader Reader. * @param writer Writer. * @param bufferSize buffer size. * @return count. * @throws IOException */ public static long write(Reader reader, Writer writer, int bufferSize) throws IOException { int read; long total = 0; char[] buf = new char[BUFFER_SIZE]; while( ( read = reader.read(buf) ) != -1 ) { writer.write(buf, 0, read); total += read; } return total; } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用ShardingJDBC進行數(shù)據(jù)分片以及讀寫分離
ShardingJDBC是一個輕量級的Java框架,提供了數(shù)據(jù)分片、讀寫分離、分布式主鍵生成等數(shù)據(jù)訪問功能,本文將給大家介紹如何使用ShardingJDBC進行數(shù)據(jù)分片以及讀寫分離,需要的朋友可以參考下2024-01-01SpringBoot詳細講解異步任務(wù)如何獲取HttpServletRequest
在使用框架日常開發(fā)中需要在controller中進行一些異步操作減少請求時間,但是發(fā)現(xiàn)在使用@Anysc注解后會出現(xiàn)Request對象無法獲取的情況,本文就此情況給出完整的解決方案2022-04-04Struts2學(xué)習(xí)筆記(5)-參數(shù)傳遞方法
本文主要介紹Struts2中參數(shù)傳遞方法,希望能給大家做一個參考。2016-06-06Redis中String字符串和sdshdr結(jié)構(gòu)體超詳細講解
這篇文章主要介紹了Redis中String字符串和sdshdr結(jié)構(gòu)體,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04