如何從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進(jìn)行數(shù)據(jù)分片以及讀寫分離
ShardingJDBC是一個輕量級的Java框架,提供了數(shù)據(jù)分片、讀寫分離、分布式主鍵生成等數(shù)據(jù)訪問功能,本文將給大家介紹如何使用ShardingJDBC進(jìn)行數(shù)據(jù)分片以及讀寫分離,需要的朋友可以參考下2024-01-01
SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest
在使用框架日常開發(fā)中需要在controller中進(jìn)行一些異步操作減少請求時間,但是發(fā)現(xiàn)在使用@Anysc注解后會出現(xiàn)Request對象無法獲取的情況,本文就此情況給出完整的解決方案2022-04-04
Struts2學(xué)習(xí)筆記(5)-參數(shù)傳遞方法
本文主要介紹Struts2中參數(shù)傳遞方法,希望能給大家做一個參考。2016-06-06
Redis中String字符串和sdshdr結(jié)構(gòu)體超詳細(xì)講解
這篇文章主要介紹了Redis中String字符串和sdshdr結(jié)構(gòu)體,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-04-04

