seUri("sdf"));
PrintWriter out = response.getWriter();
out.println("Hello. Roses are red.");
out.print("Violets are blue.");
out.flush();
}
我把servlet类中的service改成上面的样子,大家看看,其实request的parseUri方法在servlet里是不应该被使用的!
那怎么办?
第一种,将parseUri方法的public方法改成默认的访问修饰符,包外的类就不能访问了。
不过还有另一种方式
门面模式!!
在上面的例子中,我们写的request实现了ServletRequest,我们可以再写一个类RequestFacade类让他也实现ServletRequest(response 类似)
package ex02.pyrmont;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
public class RequestFacade implements ServletRequest {
private ServletRequest request = null;
public RequestFacade(Request request) {
this.request = request;
}
public String getRemoteHost() {
return request.getRemoteHost();
}
//省略对ServletRequest接口的实现
//servletrequest接口的方法 在RequestFacade 内部实现时 都调用类的属性request来实现
public void setCharacterEncoding(String encoding)
throws UnsupportedEncodingException {
request.setCharacterEncoding(encoding);
}
}
再看看 ServletProcessor 改成如下
Servlet servlet = null;
RequestFacade requestFacade = new RequestFacade(request);
ResponseFacade responseFacade = new ResponseFacade(response);
try {
servlet = (Servlet) myClass.newInstance();
servlet.service((ServletRequest) requestFacade, (ServletResponse) responseFacade);
}
catch (Exception e) {
System.out.println(e.toString());
}
catch (Throwable e) {
System.out.println(e.toString());
}
httpServer 也改成如下
if (request.getUri().startsWith("/servlet/")) {
ServletProcessor2 processor = new ServletProcessor2();
processor.process(request, response);
}
app1给servlet里面传递的参数实际上是Request类型的,有调用parseUri方法的危险。
app2给servlet里面传递的参数实际上是RequestFacade,它根本就没有parseUri方法,自然就安全了。
这篇文章中 对书中的源码有删减 大家可以
下载完整版本的
深入剖析tomcat
源码
http://down.51cto.com/data/486495
|