Spring拦截器拦截请求,获得加密的参数,怎样重新设置参数值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring拦截器拦截请求,获得加密的参数,怎样重新设置参数值?相关的知识,希望对你有一定的参考价值。
拦截器继承HandlerInterceptorAdapter类,并重写了preHandle();方法,在此方法中获得了加密后的参数字符串,解密后,怎么将解密后的参数重新设置到HttpServletRequest的URL后边,使得Action能够接受到这些参数?也就是替换加密的参数(request.getQueryString();方法得到的请求参数字符串,全部替换)
拦截器
java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
参考技术A你可以使用Filter来弄,其中的ServletRequest
然后使用HttpServletRequestWrapper重新封装。
Spring拦截器获取request请求体中的json数据,并转换成Java对象的解决办法
1、要被拦截的Controller接口
我们需要一个更新用户信息接口,请求方式为POST,参数类型为对象类型(UserInfo),代码如下:
@Resource
private UserService userService;
/**
* 更新用户信息
*
* @param request
* @param userInfo
* @return
*/
@RequestMapping(value = "/updateUserInfo", produces = "application/json;charset=UTF-8",
method = RequestMethod.POST)
public JSONObject updateUserInfo(HttpServletRequest request, @RequestBody UserInfo userInfo)
...
userService.updateUserInfo(userInfo);
...
2、拦截器
我们要在拦截器中拦截该接口,并获取其请求参数UserInfo对象。
如果只是获取普通的请求对象(eg:用户ID -> userId),我们可以直接在拦截器中,通过如下代码即可获取request请求体中的参数数据:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o)
......
// user ID为string类型,所以可以直接拿到数据,
// 但是如果参数是对象类型/JSON类型数据,则无法通过这种方式获取!
String userId = request.getParameter("userId");
.....
3、HttpServletRequestWrapper解决这一问题
在拦截器中写一个内部类 RequestWrapper ,让其继承 HttpServletRequestWrapper:
class RequestWrapper extends HttpServletRequestWrapper
RequestWrapper 重写父类方法,最终完整的拦截器代码如下:
/**
* 拦截器:
*
* @author csp
* @date 2022-01-06 15:36:41
*/
public class UserInterceptor implements HandlerInterceptor
private final static Logger logger = LoggerFactory.getLogger(UserInterceptor.class);
@Resource
private UserService userService;
/**
* 前置拦截
*
* @param request
* @param response
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception
// 从request请求体中拿到body中的JSON对象参数
RequestWrapper requestWrapper = new RequestWrapper(request);
String jsonBody = requestWrapper.getBody();
UserInfo userInfo = JSONObject.toJavaObject(JSONObject.parseObject(jsonBody), UserInfo.class);
// 根据userInfo校验是否具备权限
Boolean isAuth = userService.getAuthByUserInfo(userInfo);
if (!isAuth)
// response响应给浏览器无权限,代码略
...
return false;
return true;
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception
// RequestWrapper 内部类
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();
@Override
public ServletInputStream getInputStream() throws IOException
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
ServletInputStream servletInputStream = new ServletInputStream()
@Override
public boolean isFinished()
return false;
@Override
public boolean isReady()
return false;
@Override
public void setReadListener(ReadListener readListener)
@Override
public int read() throws IOException
return byteArrayInputStream.read();
;
return servletInputStream;
@Override
public BufferedReader getReader() throws IOException
return new BufferedReader(new InputStreamReader(this.getInputStream()));
public String getBody()
return this.body;
这样,就可以在拦截器中,拦截request请求,并获取request请求体中的json/对象类型的参数啦!
以上是关于Spring拦截器拦截请求,获得加密的参数,怎样重新设置参数值?的主要内容,如果未能解决你的问题,请参考以下文章
spring mvc 的dispatcherservlet是怎样拦截一切http请求的
spring mvc中的拦截器,怎样获取reqeust中的json数据
spring boot拦截器中获取request post请求中的参数