我改造了spring security, 使其可以进行数据级别的验证,这样以来需要从http request中读取参数值。今天在测试一个上传文件的页面时发现了个奇怪的问题。
我在我spring security的voter中来获得页面提交的参数,因为是enctype="multipart/form-data"来提交表单的,所以用以下code来解析参数。
Map<String, String[]> map = new HashMap<String, String[]>();
ServletFileUpload fileUpload = new ServletFileUpload();
FileItemIterator items = fileUpload.getItemIterator(request);
while (items.hasNext()) {
FileItemStream item = items.next();
if (item.isFormField()) {
String value =inputStream2String(item.openStream());
map.put(item.getFieldName(), new String[]{value});
}
}
顺利的把参数得到了,security就走完了,进入struts业务方法,奇怪的事情发生了,form中值都不见了,当然提交的file也不见了。于是google了下,说是request中的流文件只能被解析一次,e文网也没找到好的解决方法,这里无论我用parseRequest方式还是像我上面code类型,都有这个问题,当然也包括了用srping 的web方式解析,总之不行,理由应该是:stream被消费过就没了。
解决方式是偶然发现的,把需要在页面提交的其他非文件的参数放在form表单的action地址后面,像这样:action=" /learn/save.do?id=23".
问题解决了,我对底层的实现其实还是理解不到位,只是会用,因此会有这样的问题。另外层次分的不清晰,如果使用spring security做数据级权限验证,就可能会碰到这个问题,最好的方式应该是有一层专业解析数据的level,然后无论security还是业务都基于这一层的数据来进行。这个是属于意外情况把,花了我不少时间,打乱了原来的计划