异常
java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap。网上查了一些资料,解决方案是使用Wrapper,重写HttpServletRequestWrapper,如下:
- package com.gdcn.bpaf.security.yale;
- import java.util.Enumeration;
- import java.util.Map;
- import java.util.Vector;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletRequestWrapper;
- @SuppressWarnings("unchecked")
- public class ParameterRequestWrapper extends HttpServletRequestWrapper {
- private Map params;
- public ParameterRequestWrapper(HttpServletRequest request, Map newParams) {
- super(request);
- this.params = newParams;
- }
- public Map getParameterMap() {
- return params;
- }
- public Enumeration getParameterNames() {
- Vector l = new Vector(params.keySet());
- return l.elements();
- }
- public String[] getParameterValues(String name) {
- Object v = params.get(name);
- if (v == null) {
- return null;
- } else if (v instanceof String[]) {
- return (String[]) v;
- } else if (v instanceof String) {
- return new String[] { (String) v };
- } else {
- return new String[] { v.toString() };
- }
- }
- public String getParameter(String name) {
- Object v = params.get(name);
- if (v == null) {
- return null;
- } else if (v instanceof String[]) {
- String[] strArr = (String[]) v;
- if (strArr.length > 0) {
- return strArr[0];
- } else {
- return null;
- }
- } else if (v instanceof String) {
- return (String) v;
- } else {
- return v.toString();
- }
- }
- }
2.使用
- //然后在另一个地方使用时,按下面这样用,假如我要修改username的值
- HashMap m=new HashMap(request.getParameterMap());
- /*
- 关键部分,如果不转换成String数组,如果在下面这样是有时:
- eg:
- HttpSession session = request.getSession();
- Map map = request.getParameterMap();
- Set keySet = map.keySet();
- for (Iterator iterator = keySet.iterator(); iterator.hasNext();)
- {
- String key = (String)iterator.next();
- String values[] = (String[])map.get(key); //这个地方就会报错,因为username一个String不能转换成String数组
- if (values.length == 1)
- session.setAttribute(key, values[0]);
- else
- session.setAttribute(key, values);
- }
- 异常
- 就会出现java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.String;
- */
- //m.put("username", newusername); //这样会报错
- m.put("username", new String[]{newusername}); //这就是对的
- HttpServletRequest req = (HttpServletRequest) request;
- com.gdcn.bpaf.security.yale.ParameterRequestWrapper wrapRequest=new com.gdcn.bpaf.security.yale.ParameterRequestWrapper(req,m);
- request=wrapRequest; //这是rquest就和本身的request一样了