一、简介
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象.
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了.要向客户机输出数据,只需要找response对象就行了.
二、HttpServletResponse
HttpServletResponse对象,服务器的响应.这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法.如下方法
三、HttpServletResponse常见应用
1、向客户端输出中文数据,注意字符流和字节流的区别,编码问题
例1:采用字节流
public class ServletTest extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse response)throws Exception {
test2(response);
}
private void test2(HttpServletResponse response) throws Exception {
String data="中国2";
//html: <meta>标签模拟一个http响应头,写回去后浏览器可以解析
OutputStream out=response.getOutputStream();
//out.write(data.getBytes()); //这种方式采用平台默认的字符集编码也就是gb2332
out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
out.write(data.getBytes("UTF-8"));
}
//字节流可以读取任何数据,字符流只能读取字符
private void test1(HttpServletResponse response) throws Exception {
String data="中国";
//程序以什么码表输出,就要控制浏览器以什么码表打开(否则浏览器默认按平台的默认字符集进行解码输出)
response.setHeader("Content-type", "text/html;charset=UTF-8");
OutputStream out=response.getOutputStream();
//out.write(data.getBytes());使用平台的默认字符集将此 String
编码为 byte 序列
//下面这句程序会将data按UTF-8编码将数据转换为二进制数据传递给客户端
out.write(data.getBytes("UTF-8"));
}
}
例2:采用字符流
public class ResponseDemo2 extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse response)throws Exception{ test1(response); } private void test2(HttpServletResponse response) throws IOException { String data="中国q"; //该句代码等价于其后面两句 response.setContentType("text/html;charset=UTF-8"); //response.setCharacterEncoding("UTF-8"); //response.setHeader("Content-type", "text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); out.write(data);// } private void test1(HttpServletResponse response) throws IOException { String data="中国q"; //设置response使用的码表,控制以什么码表向response写入数据,默认为GBK字符集编码 response.setCharacterEncoding("UTF-8"); //指定浏览器以什么码表打开服务器发送的数据,默认为平台默认字符集编码 response.setHeader("Content-type", "text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); out.write(data);//setCharacterEncoding就是控制这句写入response时的编码 } }
ps:建议都指明使用UTF-8字符集编码,这样比较清晰.
例3:如果要向客户端输出数据,要将数字变成字符串
public class ServletTest extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException { test2(response); } private void test2(HttpServletResponse response) throws Exception { String data="1"; OutputStream out=response.getOutputStream(); out.write(data.getBytes()); } }
2、文件下载
//通过response实现文件下载 public class ResponseDemo3 extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse response)throws Exception { test1(response); } private void test1(HttpServletResponse response) throws Exception { String path=this.getServletContext().getRealPath("/download/new.jpg"); //C:apache-tomcat-7.0.22webappsday06download ew.jsp String filename=path.substring(path.lastIndexOf("\")+1);
//如果下载文件是中文文件,则文件名需要经过url编码 response.setHeader("content-disposition", "attachment;
filename="+URLEncoder.encode(filename,"UTF-8"));
//如下代码是一个模板 InputStream in=null; OutputStream out=null; try { in=new FileInputStream(path); int len=0; byte buffer[]=new byte[1024]; out=response.getOutputStream(); while((len=in.read(buffer))>0){ out.write(buffer,0,len); } }finally{ if(in!=null){ try{ in.close();//注意并没有关闭response流,交给servlet去管理 }catch(Exception e){ e.printStackTrace(); } } } } }
3、输出随机图片,防止恶意注册

package cn.itcast.response; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.Random; import javax.servlet.http.HttpServlet; public class RandomImage { private final static int WIDTH=80; private final static int HEIGHT=30; public static BufferedImage createImage(){ //创建图片 BufferedImage image=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR); //得到图形绘制的对象 Graphics g=image.getGraphics(); //设置背景颜色 setBackGroud(g); //设置边框 setBorder(g); //绘制内容 drawContent(g); //绘制干扰线 drawDisturbLine(g); return image; } /** * 绘制干扰线 * @param g */ private static void drawDisturbLine(Graphics g) { g.setColor(Color.yellow); Random r=new Random(); for(int i=0;i<4;i++){ int x1=r.nextInt(WIDTH); int y1=r.nextInt(HEIGHT); int x2=r.nextInt(WIDTH); int y2=r.nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2); } } /** * 绘制内容 * @param g */ private static void drawContent(Graphics g) { //字符资源 String resource="u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6"; //获取字符长度 int length=resource.length(); //随机操作对象 Random r=new Random(); //存储字符对象 StringBuffer sb=new StringBuffer(); for(int i=0;i<4;i++){ //随机产生数字 int index=r.nextInt(length); //获取字符 char c=resource.charAt(index); //拼接字符 sb.append(c); } g.setColor(Color.black); g.drawString(sb.toString(), 20, 20); } /** * 设置边框 * @param g */ private static void setBorder(Graphics g) { g.setColor(Color.black); g.drawRect(0, 0, WIDTH-2, HEIGHT-2); } /** * 设置背景颜色 * @param g */ private static void setBackGroud(Graphics g) { //绘制矩形 g.setColor(Color.lightGray); g.fillRect(0,0, WIDTH, HEIGHT); } } public class ImgServlet extends HttpServlet { final int WIDTH=80; final int HEIGH=30; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //禁止浏览器缓存数据 response.setHeader("expires", "0"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); //通知浏览器以图片的方式打开数据 response.setContentType("image/jpeg"); //把图片显示给浏览器 ImageIO.write(RandomImage.createImage(), "jpeg", response.getOutputStream()); } }
页面中这么写注意src的书写,ResponseDemo4改成对于的Servlet名称,页面中通过js点击图片时实现刷新,加入一个随机数是为类让浏览器不从缓存中读取图片:
ps:如何在服务器端判断输入的验证码是否正确呢,要用动session,后面讲.
4、发送http头,控制浏览器定时刷新网页(REFRESH)
public class ResponseDemo5 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response)throws Exception { try { test3(request,response); } catch (Exception e) { e.printStackTrace(); } } //真正开发中,servlet不会像页面直接打印数据(也就是一般不会使用test2的用法),一般是转发给jsp,然后由jsp解析数据 private void test3(HttpServletRequest request,HttpServletResponse response) throws Exception { /*response.setHeader("refresh", "3;url='/day06/index.jsp'");这种方式是不行的,
个人感觉也是转发以后这个之前的setHeader就失效了,那么像之前的下载,显示图片等,又是怎么操作的呢*/
其实这些response.setHeader都是最底层的实现原理,明白即可,实际开发都是转发到jsp页面,因为jsp中不能出现一行java脚本,所以上面的那些功能,肯定是通过meta等头元素,还有jsp的标签实现的。 String message="<meta http-equiv='refresh' content='3;url=/day06/index.jsp'>
登录成功,将在3秒后跳转,如果没有,请点<a href=''>超链接</a>"; request.setAttribute("message",message); this.getServletContext().getRequestDispatcher("/message.jsp").forward(request, response); } //登陆的时候,用户登录成功,3秒后跳转到首页 private void test2(HttpServletResponse response) throws IOException { response.setHeader("refresh", "3;url='/day06/index.jsp'"); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("登录成功,将在3秒后跳转,如果没有,请点<a href=''>超链接</a>"); } //3秒后刷新当前请求 private void test1(HttpServletResponse response) throws IOException { response.setHeader("refresh", "3"); String data = new Random().nextInt(100000)+""; response.getWriter().write(data); } }
5、发送http头,控制浏览器禁止缓存当前文档内容,之前输出随机图片中已经有相关代码,一般经常变的数据禁止浏览器缓存.
6、那么怎么控制浏览器缓存当前内容呢,实际开发中一般不常变的数据可以设置浏览器缓存?
public class ServletTest extends HttpServlet { //expires可以设置缓存文件缓存多长时间 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data="aaaaa"; response.setDateHeader("expires", System.currentTimeMillis()+3600*1000); response.getWriter().write(data); } }
ps:那么实际中转发到jsp又该如何控制呢,猜应该是在meta元素里,但是meta缓冲的是整个页面,而实际一般是只缓冲一个图片什么的又该怎么处理呢?
7、实现请求重定向,不能实现转发,ServletContext可以实现转发
一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向.重定向会发送两次请求,意味着有两个response和request,且地址栏会变;转发客户端只有一次请求,有一个response和request,地址栏不会变.
应用场景:一般用户登录和购物车会用重定向,登录后希望用户能重地址栏看到跳转到了首页;购物车如果用转发的话,用户刷新页面会又购买一次,再购物车中又加一个商品.
四、HttpServletResponse细节
1、getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象.
2、getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法,这里但如果是多个servlet之间通过转发的形式也互相排斥.
3、Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端.
4、Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象,一般我们不需要去手动close.
五、HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息.
1、常用方法
获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL.
getRequestURI方法返回请求行中的资源名部分.
getQueryString 方法返回请求行中的参数部分.
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址.
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
获得客户机请求头
getHead(name)
getHeaders(String name)
getHeaderNames()
获得客户机请求参数(客户端提交的数据)
getParameter(name)
getParameterValues(String name)
getParameterNames()
getParameterMap()
getInputStream()//客户端上传文件时可以使用
例:
public class RequestDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(request.getRequestURI());// /day06/servlet/requestDemo1 System.out.println(request.getRequestURL());//http://localhost:8080/day06/servlet/requestDemo1 System.out.println(request.getQueryString());//参数 System.out.println(request.getRemoteAddr());//127.0.0.1 System.out.println(request.getRemoteHost());//返回127.0.0.1,因为没有在DNS中注册 System.out.println(request.getRemotePort());//远程端口号49300 System.out.println(request.getMethod());//GET ,在表单里可为POST } }
public class RequestDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String value=request.getParameter("username"); System.out.println(value); //拿到所有的参数名,再拿到值 Enumeration e=request.getParameterNames(); while(e.hasMoreElements()){ String name=(String) e.nextElement(); value=request.getParameter(name); System.out.println(name+"="+value); } //一个username可能传递了多个值 String value2[]=request.getParameterValues("username"); for(String v:value2){ System.out.println("u="+v); } //web层的框架底层是这么实现的 Map<String,String[]> map=request.getParameterMap(); User user=new User(); User formbean=new User(); try { BeanUtils.populate(user, map);//用map集合填充bean BeanUtils.copyProperties(user, formbean);//bean的拷贝 } catch (Exception e1) { e1.printStackTrace(); } System.out.println(user); } private void test1(HttpServletRequest request) { //获取头相关数据 String headValue=request.getHeader("Accept-Encoding"); Enumeration e = request.getHeaderNames(); while(e.hasMoreElements()){ String name=(String) e.nextElement(); String value=request.getHeader(name); System.out.println("name="+name+",value="+value); } } }
2、request常见应用
1>各种表单输入项数据的获取(后台获取数据的三种方式,超链接,表单,ajax)
text、password、radio、checkbox、file、select、textarea、 hidden,后台通过getParameter()获取.file的获取后面有专题.
public class RequestDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getParameter("username"); request.getParameter("password"); request.getParameter("gender"); request.getParameter("city"); request.getParameter("city"); String[] likes=request.getParameterValues("likes"); //编程的一个原则,先检验再使用 for(int i=0;likes!=null && i<likes.length;i++){ System.out.println(likes[i]); } request.getParameter("description"); request.getParameter("id"); } }
2>request乱码问题
request编码数据传递到后台时,会默认按照当前打开页面的编码去编码要传的数据.
public class RequestDemo4 extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub doGet(req, resp); } //测试,下面这种情况没有乱码问题 private void test3(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, IOException { request.setCharacterEncoding("UTF-8"); String username=request.getParameter("username"); response.setCharacterEncoding("gb2312"); response.setContentType("text/htm;charset=gb2312"); response.getWriter().write(username); } private void test2(HttpServletRequest request) throws UnsupportedEncodingException { //解决POST乱码 request.setCharacterEncoding("UTF-8"); String username=request.getParameter("username"); System.out.println(username); } private void test1(HttpServletRequest request) throws UnsupportedEncodingException { //解决Get方式提交的乱码,只能手动处理 String username2=request.getParameter("username2"); //先用iso-8859-1解成二进制文件,再重新编程utf-8 username2=new String(username2.getBytes("iso-8859-1"),"UTF-8"); System.out.println(username2); } }
2>request对象实现请求转发
请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理.request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发.request对象同时也是一个域对象(request域),开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理.应用实例:MVC设计模式,软件领域最重要的设计思想,request执行完以后转发给jsp去显示数据.
public class RequestDemo9 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response){ //servlet里面一般使用request域,使用ServletContext域有线程问题 request.setAttribute("data", "中国"); //MCV 转发给一个jsp页面去显示数据 request.getRequestDispatcher("/day06/index.jsp").forward(request, response); } }
ps:jsp页面读取这个data数据,可以通过<% request.getAttribute("data") %>,现在不这么写,通过标签来写.注意getAttribute和getParameter()的区别.
3>请求转发的细节
1.如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被传送到了客户端,forward方法将抛出IllegalStateException异常.
2.如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效,那为什么转发给jsp页面的response不能实现刷新
例:
//程序将抛出异常 public class RequestDemo9 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); pw.write("aa"); pw.close();//不写这句没有写给客户端,只是写过response响应体,不会抛出异常 request.getRequestDispatcher("/day06/index.jsp").forward(request, response); } }
public class RequestDemo10 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //程序只会看到index.jsp的内容,不会看到aa,已经被清空 PrintWriter pw = response.getWriter(); pw.write("aa"); request.getRequestDispatcher("/day06/index.jsp").forward(request, response); } }
3、请求重定向和请求转发的区别
一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发.
一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向.
1、RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源.
2、如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录.
3、调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变.
4、HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为.
5、RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程.
4、include方法
RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能.
public class RequestDemo11 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //被包含页面不要有全局架构标签 request.getRequestDispatcher("/public/head.jsp").include(request, response); response.getWriter().write("hahaha"); request.getRequestDispatcher("/public/foot.jsp").include(request, response); } }
ps:1、web工程中各类地址的写法
public class ServletDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //记住以下这点写地址无往而不利 //首先写'/',给服务器用'/'代表当前web应用;给浏览器用'/'代表当前站点 //例:如下几个使用案例 : //超链接和form表单都是给浏览器 //正斜杠用在如上这些地方,反斜杠用在硬盘的资源定位上 1.request.getRequestDispatcher("/form1.html").include(request, response); 2.response.sendRedirect("/day06/form1.html"); 3.this.getServletContext().getRealPath("/form1.html"); 4.this.getServletContext().getResourceAsStream("/fomr1.html"); } }
2、防盗链用法
public class RequestDemo9 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String referer = request.getHeader("referer"); if(referer!=null&&referer.startsWith("http://localhost:8080")){ response.sendRedirect("/day06/index.jsp");//跳首页 return; } ... } }