重定向
重定向
重定向是利用服务器返回的状态码来实现的。客户游览器请求服务器的时候,服务器端会返回一个状态
码。服务器通过HttpServletResponse的setStatus(int statuss)方法设置状态码。如果服务器返回301或者302
,则游览器会到新的网址重新请求该资源。状态码代表的意义如下所示
1xx信息状态码。表示请求已被接受,正在被处理
2xx正确状态码。表示该请求已被正确接受处理,没有错误等发生。例如,200表示一切正确
3xx重定向状态码。例如301,302表示该资源已经不存在或者换了地址,客户端需要重新定向到一个新的资源。
服务器响应中会附带这个新资源地址
4xx请求错。例如401表示没有权限访问404表示资源不存在,405表示访问方式错误
5xx服务器错误。例如500表示程序出现异常而中途停止运行
301,302都表示重定向,区别是301是永久重定向,302是临时性重定向。下面的代码访问Servlet
的请求重定向到另一个网址
responsesetStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
reSponse.setHeader("Location","http://www.helloweenvsfei.com")
在HttpServletResponse类中把常用的状态代码封装成了静态的常量。吧setStatus与setHeader方法封装成另一个方法
sendRedirect(String location),只需要调用sendRedirextion就能实现重定向。
举例利用一个Servlet来统计下载文件的下载次数。要下载的文件以及下载次数都保持在一个map中。当单击下载的时候
,doget获取到文件名,更新下载的次数,并重定向到要下载的文件,达到统计下载letE数的目的
public class RedirectServlet extends HttpServlet{
Map<String, integer>map=new HeashMap<String,integer>();
@Override
public void init()theows ServletException{
map.put("/download/setup.exe,0");
map.put("/download/application.zip",0);
map.put("/dpwnload/01.mp3",0);
}
public void doget(HttpServletRequest request,HttpServletResponse response)throws ServletException
,IOException{
String filename=request.getparameter("filename");
if(filename!=null){
int hit=map.get(filename); 统计下载的次数,取得下载的次数
map.put(filename,++ hit);下载次数+1后保存
response.senRedirect(request.getContextpath()+filename);
}
else{
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
printWriter out =response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC\"-W3C//DTD HTML 4.01 TRANSITIONAL//EN\">");
out.println("<HTML>");
out.println("<HEAD><TITLE>文件下载<TITLE></HEAD>");
out.println("<link rel='stylesheet' type='text/css' href='../css/style.css'>");
out.println("<BODY><br/>");
out.println("<fueldset align=center style=width:90%><legend>文件下载<legend>");
out.println("<table width=100%>");
out.println("<tr>");
out.println(" <td><b>文件名</b></td>");
out.println("<td><b>下载次数</b></td>");
out.println("<td><b>下载</b></td>");
out.println("</tr>");
for(Entry<String,Integer>entry:map.entrySet()){
out.println("<tr>");
out.println("<td>"+entry.getkey()+"</td>");
out.println("<td>"+entry.getValue()+"</td>");
out.println("<td><a href='"+request.getRequestURl()+"?filename="+entry.getKey()+"'target='biank' onclick='
location=location;'>下载</a></td>");
out.println("</tr>");
}
out.println("<table>");
out.println("</legend>");
out.println("</BODY>");
out.println("<HTML>");
out.flush();
out.close();
}
}
@Override
public void Destroy(){
map =null;
}
}
浙公网安备 33010602011771号