简介:
随着技术的更新迭代,现在网站也越来越多,但是这样也会出现一个问题,如果一个老的网站并不能很好的支持这个平台的时候,我们这时候想着要改造这个平台、但是代码越来越多,架构越来越臃肿的时候,我们不得不放弃该平台,而去开发一个新的平台,问题虽然解决了,但是好多客户并不知道新网址的渔民更替,所以会对单位造成很大损失,这时会有一个新的名词叫做301。
什么是301重定向?
301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
什么情况下需要301重定向?
1.网站更换域名时,通过301永久重定向将旧域名重定向至新域名,挽回流量损失和SEO;
2.如果你有多个闲置域名时需要指向同一网站时,可以通过301永久重定向实现;
3.你打算实现网址规范化,例如:不带www的域名和带www的域名,实现网址的统一。
如何实现301从定向?
1. java过滤器
过滤器实现301的过程大致如下。
1.首页我们编写一个过滤器类然后实现Filter,并重写他的三个方法(init、doFilter、、destory
)。
2.获取需要的请求进行替换,然后把相应头跟状态码进行修改。
3.代码大致如下。
4.最后在web.xml中记得一个过滤器
<filter> <filter-name>UserFilter</filter-name> <filter-class>com.zerdoor.util.UserFilter</filter-class> </filter> <filter-mapping> <filter-name>UserFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
代码如下
package com.zerdoor.util;
import org.apache.commons.lang.StringUtils;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain filterChain) throws IOException, ServletException {
String hostName = "http://" + req.getServerName();
HttpServletResponse response = (HttpServletResponse) resp;
HttpServletRequest httpRequest = (HttpServletRequest) req;
if (hostName.startsWith("http://iphytc.com")) {//如果请求旧域名
//String queryString = (httpRequest.getQueryString() == null ? "": "?" + httpRequest.getQueryString());
System.out.println("//处理不带www的域名==>>");
response.setStatus(301);
String requestUrl = httpRequest.getRequestURL().toString();
requestUrl = requestUrl.replace("http://iphytc.com","http://zgzhk.com");//把旧域名替换为新的域名
response.setHeader("Location", requestUrl);
response.setHeader("Connection", "close");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","No-cache");
response.setHeader("Content-Type","text/html;charset=utf-8");
response.setHeader("Content-Language","zh-CN");
response.setHeader("Transfer-Encoding","chunked");
response.setHeader("Expires","Thu, 01 Jan 1970 00:00:00 GMT");
}if(hostName.startsWith("http://www.iphytc.com")){//处理带www的域名
System.out.println("//处理带www的域名-->>");
response.setStatus(301);
//获取请求界面的路径
String a=httpRequest.getRequestURI();
if(a.contains(".css") || a.contains(".png")|| a.contains(".jpg")){
//如果发现是css或者js文件,直接放行
System.out.println("=======================<<<==静态文件=>>>======================");
filterChain.doFilter(httpRequest, response);
}else{
String requestUrl = httpRequest.getRequestURL().toString();
System.out.println("请求iphytc的地址requestUrl是: "+requestUrl);
String param = httpRequest.getQueryString();
System.out.println("param的参数是: "+param);
String requestUrlLast = httpRequest.getRequestURL().toString()+ (StringUtils.isBlank(httpRequest.getQueryString())?"":("?"+httpRequest.getQueryString())); //请求参数;
//response.setHeader("Location", "http://www.zgzhk.com");//替换成没有www的域名
Pattern p = Pattern.compile("http://www.iphytc.com");
//String str = "http://www.iphytc.com/typeServerLevelController/serverList.html";
String str = requestUrlLast;
Matcher m = p.matcher(str);
String tmp = m.replaceAll("http://www.zgzhk.com");
System.out.println("替换后的请求是========》》》》:"+tmp);
response.setHeader("Location", tmp);//替换成没有www的域名
response.setHeader("Connection", "close");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","No-cache");
response.setHeader("Content-Type","text/html;charset=utf-8");
response.setHeader("Content-Language","zh-CN");
response.setHeader("Transfer-Encoding","chunked");
response.setHeader("Expires","Thu, 01 Jan 1970 00:00:00 GMT");
filterChain.doFilter(req, resp);
System.out.println("替换后的请求进行放行");
}
}
else {
System.out.println("当前http://www.zgzhk.com请求地址是:"+httpRequest.getRequestURL().toString()+ (StringUtils.isBlank(httpRequest.getQueryString())?"":("?"+httpRequest.getQueryString())));
filterChain.doFilter(req, resp);
}
}
@Override
public void destroy() {
}}
网友评论