栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在spring过滤器中解决multipart / form-data请求

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在spring过滤器中解决multipart / form-data请求

您不能转换

HttpServletRequest
MultipartHttpServletRequest
,因为您首先必须解决您的请求。

我使用

CommonsMultipartResolver
Class并
MultipartHttpServletRequest
使用
commonsMultipartResolver.resolveMultipart(request)
其中request是type的方法
HttpServletRequest

因此,这是我的 CSRF

checkPostedCsrfToken()
方法:

private boolean checkPostedCsrfToken() {        if (request.getParameterMap().containsKey("csrf")) { String csrf = request.getParameter("csrf"); if (csrf.equals(request.getSession().getAttribute("csrf"))) {     return true; }        } else if (request.getContentType() != null && request.getContentType().toLowerCase().contains("multipart/form-data")) { CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(); MultipartHttpServletRequest multipartRequest = commonsMultipartResolver.resolveMultipart(request); if (multipartRequest.getParameterMap().containsKey("csrf")) {     String csrf = multipartRequest.getParameter("csrf");     if (csrf.equals(request.getSession().getAttribute("csrf"))) {         return true;     } }        }        log();        return false;    }

但是,请注意,您将丢失所有请求参数和数据。因此,您必须扩展

HttpServletRequestWrapper
类以读取请求字节,并使用它们获取参数,如果对您而言重要的是参数不会丢失抛出筛选器链。

这是我在StackOverflow中找到的一个好帮手类,(我再也找不到问题了,如果找到它,我将对其进行编辑)。

MultiReadHttpServletRequest

public class MultiReadHttpServletRequest extends HttpServletRequestWrapper {    private ByteArrayOutputStream cachedBytes;    public MultiReadHttpServletRequest(HttpServletRequest request) {        super(request);    }    @Override    public ServletInputStream getInputStream() throws IOException {        if (cachedBytes == null) cacheInputStream();        return new CachedServletInputStream();    }    @Override    public BufferedReader getReader() throws IOException{        return new BufferedReader(new InputStreamReader(getInputStream()));    }    private void cacheInputStream() throws IOException {            cachedBytes = new ByteArrayOutputStream();        IOUtils.copy(super.getInputStream(), cachedBytes);    }        public class CachedServletInputStream extends ServletInputStream {        private ByteArrayInputStream input;        public CachedServletInputStream() {       input = new ByteArrayInputStream(cachedBytes.toByteArray());        }        @Override        public int read() throws IOException { return input.read();        }    }}

现在您要做的就是在filter中使用

MultiReadHttpServletRequest
而不是normal
HttpServletRequest

public class CSRFilter extends GenericFilterBean {    @Override    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {        HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) res;        MultiReadHttpServletRequest multiReadHttpServletRequest = new MultiReadHttpServletRequest(request);        CSRF csrf = new CSRF(multiReadHttpServletRequest);        if(csrf.isOk()){ chain.doFilter(multiReadHttpServletRequest, res);        }else { //todo : Show Error Page String redirect = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/access-forbidden"; response.sendRedirect(redirect);        }    }}

我希望这可以帮助某人:)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/640631.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号