如何從request中獲取body的數(shù)據(jù)
從request中獲取body的數(shù)據(jù)
如果在controller里直接@RequestBody就可以獲取,這種方式很簡(jiǎn)單,現(xiàn)在說(shuō)下直接從request中獲取。
說(shuō)下場(chǎng)景
我是在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("請(qǐng)求信息過(guò)期");
WebUtils.toHttp(response).sendError(401,"請(qǐng)求信息過(guò)期,操作失敗");
}catch (Exception e){
log.info("請(qǐng)求參數(shù)不合法");
e.printStackTrace();
WebUtils.toHttp(response).sendError(401,e.getMessage());
}
return false;
}這里給出主要的相關(guān)代碼,IOUtils是dubbo的一個(gè)類
相關(guān)依賴如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>通過(guò)這種方式獲取的是一個(gè)json字符串,
bodyStr = {
"timestamp":1523966342156
}因?yàn)槲翼?xiàng)目中沒(méi)有用到dubbo,如果為了一個(gè)body的解析引入這個(gè)感覺(jué)有些不太合適,而且啟動(dòng)的時(shí)候也沒(méi)有正常啟動(dòng),所以我把這塊代碼抽取了出來(lái):
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.
* 這段代碼來(lái)自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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中的JSONObject使用及錯(cuò)誤處理詳解
這篇文章主要給大家介紹了關(guān)于Java中的JSONObject使用及錯(cuò)誤處理的相關(guān)資料,文中講解了Java中的JSONObject創(chuàng)建、基本操作、高級(jí)特性和錯(cuò)誤處理,通過(guò)示例代碼和方法說(shuō)明,使讀者能夠理解和掌握J(rèn)SONObject的使用技巧,需要的朋友可以參考下2024-12-12
使用ShardingJDBC進(jìn)行數(shù)據(jù)分片以及讀寫(xiě)分離
ShardingJDBC是一個(gè)輕量級(jí)的Java框架,提供了數(shù)據(jù)分片、讀寫(xiě)分離、分布式主鍵生成等數(shù)據(jù)訪問(wèn)功能,本文將給大家介紹如何使用ShardingJDBC進(jìn)行數(shù)據(jù)分片以及讀寫(xiě)分離,需要的朋友可以參考下2024-01-01
SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest
在使用框架日常開(kāi)發(fā)中需要在controller中進(jìn)行一些異步操作減少請(qǐng)求時(shí)間,但是發(fā)現(xiàn)在使用@Anysc注解后會(huì)出現(xiàn)Request對(duì)象無(wú)法獲取的情況,本文就此情況給出完整的解決方案2022-04-04
Struts2學(xué)習(xí)筆記(5)-參數(shù)傳遞方法
本文主要介紹Struts2中參數(shù)傳遞方法,希望能給大家做一個(gè)參考。2016-06-06
Redis中String字符串和sdshdr結(jié)構(gòu)體超詳細(xì)講解
這篇文章主要介紹了Redis中String字符串和sdshdr結(jié)構(gòu)體,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-04-04
Java高級(jí)-反射&動(dòng)態(tài)代理詳解
這篇文章主要介紹了Java高級(jí)-反射&動(dòng)態(tài)代理詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03

