综合 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跳转的功能就完成了

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


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中生成短链接可以使用第三方的短链接生成服务或者自己实现。以下是两种常见的实现方式: 1. 使用第三方短链接生成服务: 您可以使用一些第三方短链接生成服务,比如Bitly、TinyURL等。这些服务通常提供API来生成短链接,您可以通过HTTP请求将长链接发送给他们,并获取生成的短链接。具体实现步骤如下: - 注册并获取一个短链接生成服务提供商的API密钥。 - 使用Spring Boot中的HTTP请求库,如RestTemplate或Feign来调用短链接生成服务的API。 - 将长链接作为参数发送给短链接生成服务的API,并获取返回的短链接。 - 将短链接返回给调用方使用。 2. 自己实现短链接生成: 如果您希望自己实现短链接生成功能,可以使用一些算法或者数据库来实现。以下是一个简单的示例: - 创建一个数据库表,用于保存长链接和对应的短链接。 - 当用户请求生成短链接时,生成一个唯一标识符或者使用某种哈希算法来生成短链接。 - 将长链接和对应的短链接保存到数据库中。 - 返回生成的短链接给调用方使用。 当用户点击短链接时,您可以通过拦截器或者控制器来处理请求,根据短链接查询数据库获取长链接,并进行相应的跳转。 请注意,以上只是简单的示例,具体的实现方式会根据您的需求和业务逻辑有所不同。您可以根据自己的情况进行相应的调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值