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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verpackung und die Manipulation des
HttpServletRequest
im server-Seite ist absolut nicht magisch beeinflussen die URL sehen Sie im browser die Adresse bar. Die URL steht, ist, wie es ist die eine, die der browser verwendet, um die Anforderung der gewünschten Ressource. Die gewickelten Antrag würde nur auf der server-Seite code, der ausgeführt wird, nachdem das filter auf die gleiche Anfrage.Wenn Sie möchten, ändern Sie die URL in der Adresszeile des Browsers, dann sollten Sie senden eine Umleitung an genau der gewünschten URL.
Grundsätzlich
<form action>
URL, oder ist Hinzugefügt worden, während eine Umleitung von einem anderen filter.