我想攔截過濾器/ servlet中的請求並向其添加一些參數。但是,請求不會公開'setParameter'方法,並且在操作時會拋出一個錯誤,表示它被鎖定。有沒有其他方法可以嘗試?是否可以添加到請求的可用參數(HttpServletRequest)
回答
子類HttpServletRequestWrapper
並重寫getParameter
方法。這個類的描述如下:
提供了一個方便的HttpServletRequest接口實現,可以由希望將請求調整爲Servlet的開發人員實現。
在篩選器中,將請求包裝在您的子類的實例中。
首先,您應該收到請求並讀取其所有參數。 然後用原始參數+新的參數構造另一個請求並再次發送。
HttpServletRequest是不可變的,沒有辦法改變它。
我ussualy將原始的HttpServletRequest包裝成一個新的CustomHttpServletRequest,它充當原始請求的代理,然後將這個新的CustomHttpServletRequest傳遞給過濾器鏈。
在這個CustomHttpServletRequest中,你可以覆蓋getParameterNames,getParameter,getParameterMap方法來返回你想要的任何參數。
這是過濾器的一個示例:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletRequest customRequest = new CustomHttpServletRequest(httpRequest);
customRequest.addParameter(xxx, "xxx");
chain.doFilter(customRequest, response);
}
謝謝:)。這工作。 – 2008-10-10 14:10:37
否則,您可以使用強類型的setAttribute()方法。因此,可以使用getAttribute()方法...
爲什麼不直接將變量存儲爲請求範圍屬性,而不是將它們附加到請求參數中?
您可以將HttpServletRequest包裝到新的HttpServletRequestWrapper對象中並覆蓋一些方法。
以下代碼來自http://www.ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/。
要在過濾器中添加參數:
public class MyFilter implements Filter {
...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (request instanceof HttpServletRequest) {
HttpServletRequest httprequest = (HttpServletRequest) request;
Map<String, String[]> extraParams = new HashMap<String, String[]>();
extraParams.put("myparamname", String[] { "myparamvalue" });
request = new WrappedRequestWithParameter(httprequest, extraParams);
}
chain.doFilter(request, response);
}
...
class WrappedRequestWithParameter extends HttpServletRequestWrapper {
private final Map<String, String[]> modifiableParameters;
private Map<String, String[]> allParameters = null;
public WrappedRequestWithParameter(final HttpServletRequest request, final Map<String, String[]> additionalParams) {
super(request);
modifiableParameters = new TreeMap<String, String[]>();
modifiableParameters.putAll(additionalParams);
}
@Override
public String getParameter(final String name) {
String[] strings = getParameterMap().get(name);
if (strings != null) {
return strings[0];
}
return super.getParameter(name);
}
@Override
public Map<String, String[]> getParameterMap() {
if (allParameters == null) {
allParameters = new TreeMap<String, String[]>();
allParameters.putAll(super.getParameterMap());
allParameters.putAll(modifiableParameters);
}
// Return an unmodifiable collection because we need to uphold the interface contract.
return Collections.unmodifiableMap(allParameters);
}
@Override
public Enumeration<String> getParameterNames() {
return Collections.enumeration(getParameterMap().keySet());
}
@Override
public String[] getParameterValues(final String name) {
return getParameterMap().get(name);
}
}
}
- 1. 是否可以將請求參數附加到ajax中的HTTP DELETE請求?
- 2. 是否可以將請求標頭添加到iframe src請求中?
- 3. 可以添加到DbCommand的參數數量是否有限制?
- 4. 我可以使用Ajax.Responder向PrototypeJS Ajax請求添加參數嗎?
- 5. 是否可以過濾葡萄API的請求參數?
- 6. 是否可以只使用POST請求?
- 7. 是否可以添加請求標頭來重定向URI?
- 8. SETUP請求之前是否可以收到RTSP TEARDOWN請求?
- 9. 我可以請求參數添加到SockJs構造函數,以便它可以被髮送到服務器
- 10. 當使用GET(Flash AS2)時,是否可以將請求標頭添加到LoadVars
- 11. 是否可以從REST請求獲取POST參數?
- 12. 是否可以使用可變參數?
- 13. 是否可以添加類?
- 14. Java是否可以發送一個httpServletRequest到一個函數?
- 15. 是否可以添加到filter_var()函數用戶定義的參數?
- 16. 是否可以爲所有jQuery post調用添加參數?
- 17. 是否可以使用POST請求而不是GET請求重定向到URL?
- 18. 是否可以添加ScrollView到AppBarLayout
- 19. 是否可以將MouseMotionListener添加到BufferedImage?
- 20. 當評論添加到TFS Git pull請求時,是否可以接收通知?
- 21. HttpServletRequest無法獲取xhr請求參數
- 22. 在spring webflow視圖中使用請求參數是否可行?
- 23. 添加參數請求()流
- 24. 將參數添加到setHTTPBody請求Xcode
- 25. 是否有可能更多的參數添加到RequestParameterMap
- 26. 是否可以增加Google Cloud Datastore請求的超時時間?
- 27. 是否可以從POST請求請求密碼?
- 28. 是否可以添加錨/參數鏈接與Kaminari?
- 29. 是否可以向@Query參數添加通配符?
- 30. Nginx proxy_pass:是否可以向URL添加一個靜態參數?
謝謝:)。這工作。 – 2008-10-10 14:10:02
你能提供一個例子嗎? – 2013-03-26 15:26:36
公用類CustomHttpServletRequestWrapper擴展HttpServletRequestWrapper { \t private Map customParameters; \t public CustomHttpServletRequestWrapper(HttpServletRequest request){ \t \t super(request); \t} \t公共無效addCustomParameter(字符串名稱,字符串值){ \t \t customParameters。把(名字,價值); \t} \t @Override \t公共字符串的getParameter(字符串名稱){ \t \t字符串originalParameter = super.getParameter(名稱); \t \t if(originalParameter!= null){ \t \t \t return originalParameter; \t \t} else { \t \t \t return customParameters.get(name); \t \t} \t} } –
Riccati
2015-07-15 15:38:17