<servlet-filter key="user-assign-filter" class="com.company.jira.filter.UserAssignFilter" location="before-dispatch" weight="200"> <description>用户指派过滤器</description> <url-pattern>/secure/QuickCreateIssue.jspa*</url-pattern> </servlet-filter>通过Firefox的firebug工具捕获到了/secure/QuickCreateIssue.jspa*的请求
在创建issue的时候如果没有设置经办人,那么经办人的值为-1,当然在issue的创建的后台会被置成项目的负责人,所以思路有了,就是要在过滤器这里修改掉assignee的值
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { String assignee = servletRequest.getParameter("assignee"); String reporter = servletRequest.getParameter("reporter"); if ("-1".equals(assignee)) { //-1代表默认值 HashMap map = new HashMap(servletRequest.getParameterMap()); map.put("assignee", new String[]{reporter}); ParameterRequestWrapper wrapRequest = new ParameterRequestWrapper((HttpServletRequest) servletRequest, map); filterChain.doFilter(wrapRequest, servletResponse); } else { filterChain.doFilter(servletRequest, servletResponse); } }由于servletRequest.getParameterMap()这个map中的值无法修改,只好通过自定义一个ParameterRequestWrapper对象来解决
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 v = new Vector(params.keySet()); return v.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(); } } }