JavaWeb项目中如何扩展一个Request对象——包装器HttpServletRequestWrapper
生活随笔
收集整理的這篇文章主要介紹了
JavaWeb项目中如何扩展一个Request对象——包装器HttpServletRequestWrapper
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、使用場景
在一個JavaWeb中我們會遇到統一處理出入參或者處理特殊參數的場景,這些場景就需要我們擴展我們的Request對象。所謂的包裝器就是在原來的基礎上包裝一下就是在原來功能上添加一些其他功能。具體使用場景如下:
二、具體實現
1、首先繼承HttpServletRequestWrapper
public class MyRequestWrapper extends HttpServletRequestWrapper {private Map params = new HashMap<>();public MyRequestWrapper(HttpServletRequest request, Map newParams) {super(request);if(request.getParameterMap() != null){this.params.putAll(request.getParameterMap());}if(newParams != null){this.params.putAll(newParams);}}//主要覆蓋這個方法來獲取新的參數對象@Overridepublic Map getParameterMap() {return params;}public Enumeration getParameterNames() {Vector l = new Vector(params.keySet());return l.elements();}@Overridepublic 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()};}}/*** 根據參數的key獲取參數* @param name* @return*/@Overridepublic 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、編寫過濾器代碼
public class MyFilter implements Filter {//日志private static final Logger LOGGER = LogManager.getLogger();@Overridepublic void init(FilterConfig filterConfig) throws ServletException {LOGGER.info("MyFilter過濾器初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {//獲取HttpServletRequest對象HttpServletRequest httpServletRequest = (HttpServletRequest) request;String ipAddr = HttpUtil.getIpAddress(httpServletRequest);LOGGER.info("ip地址為:" + ipAddr);Map paramMap = new HashMap<>();paramMap.put("ipAddr", ipAddr);MyRequestWrapper myRequestWrapper = new MyRequestWrapper(httpServletRequest, paramMap);chain.doFilter(myRequestWrapper, response);}@Overridepublic void destroy() {LOGGER.info("MyFilter過濾器被銷毀");} }編寫完過濾器需要在web.xml添加過濾器配置
<filter><filter-name>MyFilter</filter-name><filter-class>com.leo.filter.MyFilter</filter-class></filter><filter-mapping><filter-name>MyFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>3、編寫測試代碼
@RequestMapping(value = "/getIpAddr", method = RequestMethod.GET)@ResponseBodypublic String getIpAddr(HttpServletRequest request){String ipAddr = request.getParameter("ipAddr");LOGGER.info("獲取參數:" + ipAddr);return ipAddr;}啟動項目,訪問:http://localhost:8080/springmvc/getIpAddr
后臺日志:
完整代碼請參考:
chapter-6-springmvc-mybatis1(常規整合)
https://gitee.com/leo825/spring-framework-learning-example.git
總結
以上是生活随笔為你收集整理的JavaWeb项目中如何扩展一个Request对象——包装器HttpServletRequestWrapper的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mybatis如何打印sql语句
- 下一篇: JavaWeb中如何通过Request对