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。
- 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>