HttpServletRequestWrapper entfernt, parameter anzeigen, die noch bis

Ich versuche heraus zu filtern, einen query-parameter namens 'Vernunft' über einen Filter in java/jsp.

Grundsätzlich wird der filter in Ort, um sicherzustellen, dass ein Benutzer eingegeben hat ein 'Grund' für die Anzeige einer Seite. Wenn Sie nicht haben, die es braucht, um Sie umzuleiten, um die "enter Vernunft' - Seite. Sobald Sie eingegeben haben, die einen triftigen Grund haben, können Sie weiterhin auf der Seite, die Sie angefordert.

Also die Grundlagen der it-Arbeit. Aber der 'Grund' ist geschickt über eine Abfrage paremter (D. H. GET-parameter). Sobald der Benutzer wählt ein Grund, die Grund-parameter wird weitergeleitet auf die Seite, die Sie sehen wollte. Dies ist ein problem, da die überprüfung, ob der Grund paremeter existiert, ist eine der wichtigsten Möglichkeiten, die die filter bestimmt, ob der Benutzer bewegen kann auf.

Ich habe versucht, die Erweiterung HttpServletRequestWrapper, und überschrieb eine Reihe von Methoden (d.h. getPameter usw.), in einer Anstrengung, um entfernen Sie die 'Grund' - parameter. Jedoch, ich habe nicht in der Lage, um zu sehen, der parameter entfernt werden. Sobald der Filter leitet auf die gewünschte Seite, die 'Grund' - parameter wird immer in den query-string (d.h. die url in der browser-url-Leiste) als GET-parameter.

Meinen filter Klasse sieht wie folgt aus:

public final class AccessRequestFilter implements Filter {

    public class FilteredRequest extends HttpServletRequestWrapper {

        public FilteredRequest(ServletRequest request) {
            super((HttpServletRequest)request);
        }

        @Override
        public String getParameter(String paramName) {
            String value = super.getParameter(paramName);

            if ("reason".equals(paramName)) {
                value = null;
            }

            return value;
        }

        @Override
        public String[] getParameterValues(String paramName) {
            String[] values = super.getParameterValues(paramName);

            if ("reason".equals(paramName)) {
                values = null;
            }

            return values;
        }

        @Override
        public Enumeration<String> getParameterNames() {
            return Collections.enumeration(getParameterMap().keySet());
        }

        @Override
        public Map<String, String[]> getParameterMap() {            
            Map<String, String[]> params = new HashMap<String, String[]>();
            Map<String, String[]> originalParams = super.getParameterMap();

            for(Object o : originalParams.entrySet()) {
                Map.Entry<String, String[]> pairs = (Map.Entry<String, String[]>) o;
                params.put(pairs.getKey(), pairs.getValue());
            }

            params.remove("reason");

            return params;
        }

        @Override
        public String getQueryString() {
            String qs = super.getQueryString();

            return qs.replaceAll("reason=", "old_reason=");
        }

        @Override
        public StringBuffer getRequestURL() {
            String qs = super.getRequestURL().toString();

            return new StringBuffer( qs.replaceAll("reason=", "old_reason=") );
        }
    }

    private FilterConfig filterConfig = null;  
    private static final Logger logger = MiscUtils.getLogger();

    public void init(FilterConfig filterConfig) throws ServletException {  
        this.filterConfig = filterConfig;  
    }  

    public void destroy() {  
        this.filterConfig = null;  
    }  

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
        logger.debug("Entering AccessRequestFilter.doFilter()");

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpSession session = httpRequest.getSession();

        boolean canView = false;
        long echartAccessTime = 0L;
        String demographicNo = "";
        String reason = "";
        Date current = new Date();

        String user_no = (String) session.getAttribute("user");

        ProgramProviderDAO programProviderDAO = (ProgramProviderDAO)SpringUtils.getBean("programProviderDAO");
        ProgramQueueDao programQueueDao = (ProgramQueueDao)SpringUtils.getBean("programQueueDao");

        //Check to see if user has submitted a reason
        reason = request.getParameter("reason");
        demographicNo = request.getParameter("demographicNo");
        Long demographicNoAsLong = 0L;
        try {
            demographicNoAsLong = Long.parseLong( demographicNo );
        } catch (Exception e) {
            logger.error("Unable to parse demographic number.", e);
        }

        if (reason == null) {
            //If no reason was submitted, see if user still has time remaining on previous submission (if there was one)
            try {
                echartAccessTime = (Long)session.getServletContext().getAttribute("echartAccessTime_" + demographicNo);
            } catch (Exception e) {
                logger.warn("No access time found");
            }

            if (current.getTime() - echartAccessTime < 30000) {
                canView = true;
            }
        } else if (!reason.equals("")) {
            //TODO: validate reason
            canView = true;
            session.getServletContext().setAttribute("echartAccessTime_" + demographicNo, current.getTime());
            String ip = request.getRemoteAddr();
            //Log the access request and the reason given for access
            LogAction.addLog(user_no, "access", "eChart", demographicNo, ip, demographicNo, reason);
        }

        if (!canView) {
            //Check if provider is part of circle of care
            List<Long> programIds = new ArrayList<Long>();

            List<ProgramQueue> programQueues = programQueueDao.getAdmittedProgramQueuesByDemographicId( demographicNoAsLong );
            if (programQueues != null && programQueues.size() > 0) {
                for (ProgramQueue pq : programQueues) {
                    programIds.add( pq.getProgramId() );
                }

                List<ProgramProvider> programProviders = programProviderDAO.getProgramProviderByProviderProgramId(user_no, programIds);

                if (programProviders != null && programProviders.size() > 0) {
                    canView = true;
                }
            }
        }

        String useNewCaseMgmt;
        if((useNewCaseMgmt = request.getParameter("newCaseManagement")) != null ) {     
            session.setAttribute("newCaseManagement", useNewCaseMgmt); 
            ArrayList<String> users = (ArrayList<String>)session.getServletContext().getAttribute("CaseMgmtUsers");
            if( users != null ) {
                users.add(request.getParameter("providerNo"));
                session.getServletContext().setAttribute("CaseMgmtUsers", users);
            }
        }
        else {
            useNewCaseMgmt = (String)session.getAttribute("newCaseManagement");             
        }

        String requestURI = httpRequest.getRequestURI();
        String contextPath = httpRequest.getContextPath();

        if (!canView && !requestURI.startsWith(contextPath + "/casemgmt/accessRequest.jsp")) {
            httpResponse.sendRedirect(contextPath + "/casemgmt/accessRequest.jsp?" + httpRequest.getQueryString());
            return;
        }

        logger.debug("AccessRequestFilter chainning");
        chain.doFilter( new FilteredRequest(request), response);
    }
}

Ist das filter-setup-abfangen aller Anfrage und leitet Sie kommen in ein Unterverzeichnis namens casemgmt. Der filter in web.xml ist wie:

<filter>
        <filter-name>AccessRequestFilter</filter-name>
        <filter-class>org.oscarehr.casemgmt.filter.AccessRequestFilter</filter-class>
    </filter>
...
<filter-mapping>
        <filter-name>AccessRequestFilter</filter-name>
        <url-pattern>/casemgmt/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

Jemand irgendwelche Ideen, wie ich kann tatsächlich entfernen die 'Grund' - parameter?

  • Was genau meinst du wenn du sagst "query-string"? Die eine, die Sie sehen in der browser-Adressleiste? Durch die Art und Weise, Ihre getRequestURL() überschreiben ist unnötig. Es enthält nicht die query-string-Teil überhaupt.
  • Ahh..ja, ich war immer verzweifelt, so dass ich begann die Umsetzung einer Reihe von Methoden, die ich vielleicht nicht hätte. Ich habe geklärt, was ich meine, durch die query-string in der post. danke.
  • Hmm OK. Warum denken Sie, dass die Verpackung und die Manipulation des HTTP-servlet-request auf die URL in der browser-Adressleiste? Nur ein redirect macht.
  • im Grunde muss ich nur die 'Grund' - parameter Weg zu gehen, oder einen anderen Namen haben. Ich kann also nicht einfach verwenden doFilter - und Stromversorgung gibt es einen umschlossenen Anfrage? Ich habe umleiten?
  • Ich postete eine Antwort.
  • ok, werde ich probieren. Danke @BalusC

InformationsquelleAutor Jarrett | 2013-02-15
Schreibe einen Kommentar