"
1,现在需要从过滤器里面获取HttpServletResponse,再从HttpServletResponse获取返回给前端的json数据。
2,场景,当用户发生了增删改的操作的时候,获取用户操作的url,参数,然后根据操作是否成功,若是成功,那么将用户的这些操作日志数据插入数据库,用户操作的url,参数可以从ServletRequest里面获取,但是用户操作是否成功需要根据HttpServletResponse里面返回给前端json数据里面的一个key来判断。
但是现在不知怎么获取json数据。
3,`public class LogFilter extends AdviceFilter {
@Override
public void afterCompletion(ServletRequest request, ServletResponse response, Exception exception) throws Exception {
HttpServletRequest r = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
System.out.println(r.getMethod());
Map<String, String[]> map = request.getParameterMap();
Map<String ,String > resultMap=new LinkedHashMap<>();
for (Map.Entry<String, String[]> me : map.entrySet()) {
String paramName = me.getKey();
resultMap.put(paramName,request.getParameter(paramName));
}
System.out.println("resultMap"+resultMap);
System.out.println(r.getRequestURI());
//就是这里不知道怎么获取HttpServletResponse里面的json
ServletOutputStream out=res.getOutputStream();
}
}`
" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/d0f6366598294b9bb79ea3045afb04c7.png)"
在servlet填充Response的时候,做JSON格式的数据转换
使用的类是net.sf.json.JSONObject,传入response对象和返回的显示类,修改response,返回前台JSON格式数据
代码:
/**
*/
protected void responseOutWithJson(HttpServletResponse response,
Object responseObject) {
//将实体对象转换为JSON Object转换
JSONObject responseJSONObject = JSONObject.fromObject(responseObject);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = null;
try {
out = response.getWriter();
out.append(responseJSONObject.toString());
logger.debug("返回是\n");
logger.debug(responseJSONObject.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
######很难拿到,除非你做一个Filter把response.getOutputStream()
也重载了,给个参考:
https://github.com/xqbase/uti...
######response是采用缓存输出流的方式回写,当执行到HandlerInterceptor.afterCompletion时,大部分数据可能已经写回的客户端, 没有办法获得了. 可以尝试用Servlet Filter, 把里面的response替换成自己的实现, 但要注意的是如果不用流,而是保留在内存里,那么以性能和内存都要小心处理才行.
######重写HttpServletResponseWrapper,class MyResponseWrapper extends HttpServletResponseWrapper,
在Filter里面public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException
MyResponseWrapper responseWrapper=new MyResponseWrapper((HttpServletResponse)response);
即可使用responseWrapper得到json
我现在也是在这个问题.求助呀
######可以通过implements ResponseBodyAdvice来实现(千万不要忘记@ControllerAdvice的注解哦)。
其中要实现一个 beforeBodyWrite 的方法,方法的参数 Object body 就是即将写入 response 的返回内容,我们可以把它取出来进行替换、修改、加密等操作。
自己写过,希望能帮助大家 :)
######response.setContentType("application/json;charset=utf-8");
response.setCharacterEncoding("utf-8");
response.getWriter().print();
就是这个
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。