JavaWeb_HttpServletRequestWrapper

HttpServletRequestWrapper

  • 1.HttpServletWrapper 和 HttpServletResponseWrapper
     1)Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象,HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法,这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法。
//包装类实现 ServletRequest 接口. 
public class ServletRequestWrapper implements ServletRequest {

    //被包装的那个 ServletRequest 对象
    private ServletRequest request;
	
	//构造器传入 ServletRequest 实现类对象
    public ServletRequestWrapper(ServletRequest request) {
		if (request == null) {
		    throw new IllegalArgumentException("Request cannot be null");   
		}
		this.request = request;
    }

	//具体实现 ServletRequest 的方法: 调用被包装的那个成员变量的方法实现。 
    public Object getAttribute(String name) {
		return this.request.getAttribute(name);
	}

    public Enumeration getAttributeNames() {
		return this.request.getAttributeNames();
	}    
	
	//...	
}	

相类似 Servlet API 也提供了一个 HttpServletResponseWrapper 类来包装原始的 response 对象。
   2)作用:用于对 HttpServletRequest 或 HttpServletResponse 的某一个方法进行修改或增强。

public class MyHttpServletRequest extends HttpServletRequestWrapper{

	public MyHttpServletRequest(HttpServletRequest request) {
		super(request);
	}
	
	@Override
	public String getParameter(String name) {
		String val = super.getParameter(name);
		if(val != null && val.contains(" fuck ")){
			val = val.replace("fuck", "****");
		}
		return val;
	}
}

.
   3) 使用:在 Filter 中, 利用 MyHttpServletRequest 替换传入的 HttpServletRequest

HttpServletRequest req = new MyHttpServletRequest(request);
chain.doFilter(req, response);

此时到达目标 Servlet 或 JSP 的 HttpServletRequest 实际上是 MyHttpServletRequest。
JavaWeb同步学习笔记之八十一、JavaWeb_HttpServletRequestWrapper

  • 2.代码实现
    MyHttpServletRequest.java
/**  
 * All rights Reserved,Designed By XS
 * @Title: MyHttpServletRequest.java
 * @Package com.xs.javaweb
 * @Description: TODO
 * @author: XS
 * @date: 2019年3月19日 下午5:43:59
 * @version V1.0
 */
package com.xs.javaweb;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**   
 * @ClassName: MyHttpServletRequest
 * @Description: TODO
 * @author: XS
 * @date: 2019年3月19日 下午5:43:59
 * @version V1.0
 */
public class MyHttpServletRequest extends HttpServletRequestWrapper {

	/**   
	 * @Title: MyHttpServletRequest
	 * @Description: TODO
	 * @param request
	 */
	public MyHttpServletRequest(HttpServletRequest request) {
		super(request);
	}
	
	/**   
	 * <p>Title: getParameter</p>
	 * <p>Description: </p>
	 * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
	 * @param name
	 * @return
	 */
	@Override
	public String getParameter(String name) {
		String val = super.getParameter(name);
		if (val != null && val.contains(" fuck ")) {
			val = val.replace("fuck", "****");
		}
		return val;
	}
	
}

ContentFilter.java

package com.xs.javaweb;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class Content
 */
@WebFilter(urlPatterns = { "/wrapper/bbs.jsp" })
public class ContentFilter extends HttpFilter {

	/**   
	 * <p>Title: doFilter</p>
	 * <p>Description: </p>
	 * @see com.xs.javaweb.HttpFilter#doFilter(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
	 * @param request
	 * @param response
	 * @param chain
	 * @throws IOException
	 * @throws ServletException
	 */
	@Override
	public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		//1. 获取请求 content 参数的值
    	String content = request.getParameter("content");
    	
    	System.out.println(request); 
    	HttpServletRequest req = new MyHttpServletRequest(request);
    	
    	//2. 把其中 fuck, shit 等字符串替换换为 ****
    	if(content.contains(" fuck ")){
    		//SerletRequest, HttpServletRequest 中并没有提供诸如 setParameter(paramName, paramValue)
    		//类似于这样的方法. 
    		
    		//目标: 改变 HttpServletRequest 的 getParameter(String) 方法的行为: 若该方法的返回值中
    		//包含 " fuck ", 则替换为 " **** "
    		
    		//1. 若对于一个类的方法不满意, 需要进行重写, 最常见的方式是, 继承父类, 重写方法. 
    		//若实现则需要继承 org.apache.catalina.connector.RequestFacade, 而这仅是 Tomcat
    		//服务器的实现, 若更换服务器, 该方案将无法使用. ✖. 
    		
    		//2. 直接写一个 HttpServletRequest 接口的实现类: 无法实现	其中方法. ✖
    		
    		//3. 装饰目前的 HttpServletRequest 对象: 装饰其 getParameter 方法, 而其他方法还和其实现相同.
    		//创建一个类, 该类实现 HttpServletRequest 接口, 把当前 doFilter 中的 request 传入到该类中, 作为
    		//其成员变量, 使用该成员变量去实现接口的全部方法. 
    		
    	}
    	
    	//3. 转到目标页面
    	chain.doFilter(req, response);
		
	}

}

content.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<form action="bbs.jsp" method="post">
		
		content:<textarea rows="5" cols="21" name="content"></textarea>
		<input type="submit" value="Submit">
		
	</form>

</body>
</html>

bbs.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	content:${param.content }

</body>
</html>

相关文章: