隐藏不良信息(HttpServletrequestWrapper)

package com.greatest.Filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//自定义HttpFilter方法 ,实现Filter接口
public abstract class MyFilter implements Filter {

	// 用于保存FilterConfig方法
	private FilterConfig fconfig;

	// 不建议子类直接覆盖,若直接覆盖,可能会导致filterconfig成员变量初始化失败
	@Override
	public void init(FilterConfig Config) throws ServletException {
		this.fconfig = Config;
		init();
	}

	// 供子類繼承的初始化方法 可以通过getFilterConfig()方法获取FilterConfig对象
	protected void init() {
		// TODO Auto-generated method stub

	}// 直接返回init(ServletConfig)的FilterConfig对象

	public FilterConfig getFconfig() {
		return fconfig;
	}

	@Override
	public void destroy() {
	}

	// 原声的doFilter方法 在方法内部把ServletRequest ,ServletResponse转为了
	// HttpServletRequest 和 HttpSrevletResponse 并调用了
	// doFilter(ServletRequest Req, ServletResponse Resp, FilterChain Chain)
	// 若编写Filter的过滤方法 不建议直接继承该方法 而建议 继承
	// public abstract void doFilter(HttpServletRequest
	// request,HttpServletResponse response,
	// FilterChain Chain) 方法
	@Override
	public void doFilter(ServletRequest Req, ServletResponse Resp, FilterChain Chain)
			throws IOException, ServletException {
		HttpServletRequest requesr = (HttpServletRequest) Req;
		HttpServletResponse response = (HttpServletResponse) Resp;

		doFilter(requesr, response, Chain);

	}// 抽像方法 为Http请求定制 必须实现的方法

	public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain Chain)
			throws IOException, ServletException;

}
package com.greatest.Filter;

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

public class MyHttpServletRequest extends HttpServletRequestWrapper {
		public MyHttpServletRequest(HttpServletRequest request) {
			super(request);
			// TODO Auto-generated constructor stub
		}
	    @Override
	       //增强方法  不光获取值  还要判断  
	    public String getParameter(String name) {
	       String  val=super.getParameter(name);
	       if(val!=null&&val.contains(" fuck ")){
	    	   val=val.replace("fuck", "****");
	       }
	    	return val;
	    }
	}
package com.greatest.Filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class ContentFilter
 */
@WebFilter("/bbs.jsp")
public class ContentFilter extends MyFilter{

	 public void doFilter(HttpServletRequest request,
	    		HttpServletResponse response, FilterChain filterChain)
	    		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. 转到目标页面
	    	filterChain.doFilter(req, response);
	    }
}
Content JSP
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; 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>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    content:${param.content } 
    <br><br>
    method:<%=request.getMethod() %>
    <br><br>
    <%=request %>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_42676998/article/details/82843572
今日推荐