关于Servlet重定向简介

时间:2022-01-25 20:08:22

重定向是利用服务器返回的状态码来实现的。浏览器请求服务器时,服务器会返回一个状态码。服务器端通过HttpServletResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302,则浏览器回到新得网址请求资源.

301和302都表示重定向,区别是301是永久重定向,302是临时性重定向。

下面利用重定向来实现下载文件并统计下载次数:

package com.servlet.demo;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RedirectServlet extends HttpServlet{

/**
*
*/
private static final long serialVersionUID = -7937275807775662144L;
Map<String,Integer> map = new HashMap<String,Integer>();
@SuppressWarnings("unchecked")
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
this.log("...读取初始化参数START...");
Enumeration<String> params = this.getServletConfig().getInitParameterNames();
while(params.hasMoreElements()){
String url = this.getInitParameter(params.nextElement());
map.put(url, 0);
}
this.log("...读取初始化参数END...");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
String fileName = request.getParameter("fileName");
if(null!=fileName && fileName.length()>0){
int hit = map.get(fileName);
map.put(fileName, ++hit);
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
log(request.getContextPath()+fileName);
response.sendRedirect(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("<body>");
out.println("<fieldset align=left style=width:90%><legend>文件下载</legend><table width=100%>");
out.println("<tr><td><b>文件名</b></td><td><b>下载次数</b></td><td><b>下载</b></td></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.getRequestURI()+"?fileName="+entry.getKey()+"' target='blank' onclick='location=location;'>下载</a></td>");
out.println("</tr>");
}
out.println("</table></fieldset></body></html>");
out.flush();
out.close();
}

}
@Override
public void destroy() {
// TODO Auto-generated method stub
map = null;
}
}
注意onclick='location=location;'实现了页面刷新的功能


当使用Redirect跳转Servlet时,跳转是在客户端实现的。也就是说浏览器实际上请求了两次服务器。第一次获取重定向状态码和重定向网址。第二次访问真实网址。