综合 301跳转、spring boot 拦截器

最近做项目遇到一个问题,两个域名映射到同一个服务器地址,其中有一个域名是旧的,需要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跳转的功能就完成了

本人初出茅庐,水平有限,有哪里写的不对的地方,还希望大家指正。


你可能感兴趣的:(综合 301跳转、spring boot 拦截器)