最近做项目遇到一个问题,两个域名映射到同一个服务器地址,其中有一个域名是旧的,需要301跳转到新的域名。
301 重定向 指页面永久性移走(301重定向)是一种非常重要的“自动转向”技术。网址重定向最为可行的一种办法。当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
301跳转的方法很多
最为简单的就是 jsp页面或后台使用response修改状态码301返回
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location","你的跳转网址");
然而项目所有页面都是通过freemaker生成的静态html(方便百度收录),无法使用java代码片段。后端使用的是spring boot。考虑到所有旧的域名所有请求全部需要301跳转,所幸使用拦截器来统一处理。
spring boot自定义拦截器需要实现HandlerInterceptor接口,这一点与Spring MVC使用拦截器一样
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if(request.getRequestURL().indexOf("http://baidu.com")==0) {
//以http://baidu.com 域名开头的请求全部301跳转以http://www.baidu.com开头
String address = (request.getRequestURL()+"").replaceAll("http://baidu.com", "http://www.baidu.com");
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location",address);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
补充接口中的三个回调方法:
preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器;
返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。------------------------------------------------------------------------------------------------------------------
在Spring MVC 中 在Spring配置文件中配置自定义拦截器,而spring boot 推荐使用java配置的方式,因此我们需要写一个配置类,这个类需要继承 WebMvcConfigurerAdapter 通过重写addInterceptors方法(通过名字就能看出这个方法是用来干什么的了)
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加MyInterceptor这个自定义拦截器 ‘’/**所有请求路径
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
这样整个以拦截器实现301跳转的功能就完成了
本人初出茅庐,水平有限,有哪里写的不对的地方,还希望大家指正。