综合 301跳转、spring boot 拦截器

本文介绍如何使用SpringBoot的自定义拦截器实现全站301跳转,适用于旧域名到新域名的迁移场景。通过实现HandlerInterceptor接口,并在配置类中注册拦截器。

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

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


<think>好的,用户现在想知道如何在Spring Boot 3中搭建拦截器。我之前已经回答过关于配置拦截器的问题,但需要根据用户提供的引用和之前的对话来调整回答。 首先,用户引用了三个资料:[^1]提到拦截器配置的基本概念,[^2]是关于整合过滤器和拦截器的步骤,[^3]则是登录验证的示例。虽然用户提到这些引用仅供参考,但应该尽量结合这些内容来构建回答。 用户之前的问题是关于通过网址引用ICO图标,现在转向拦截器的搭建,可能是在开发Web应用时遇到了权限控制或日志记录的需求。需要确保回答结构清晰,分步骤说明,并提供代码示例。同时,用户可能希望了解Spring Boot 3中的新变化,但引用中没有提到版本差异,可能需要默认当前版本与之前类似,但需确认是否有更新。 需要检查Spring Boot 3的拦截器配置是否有变化。根据经验,Spring Boot 3基于Spring Framework 6,可能支持更简洁的配置方式,但基本流程不变:创建拦截器类,实现HandlerInterceptor,注册拦截器到配置类。 接下来,按照用户之前的回答模板,分步骤说明,并加入注意事项和备选方案。引用中的资料可以作为补充,例如登录验证的示例,可以融入到示例代码中。同时,用户可能需要了解拦截器的应用场景,如权限验证、日志记录等,这可以放在注意事项或相关问题中。 需要确保代码示例正确,使用Java和Spring Boot 3的语法,例如是否需要用特定的注解或配置方式。同时,用户可能对拦截器与过滤器的区别感兴趣,可以简要提及,但根据引用[^2]已经讨论过整合过滤器,所以可能不需要深入,除非用户明确问及。 最后,生成的相关问题需要围绕拦截器的使用场景、高级配置、异常处理等,帮助用户进一步探索。例如,如何实现多个拦截器的顺序,或者如何排除某些路径。</think>### Spring Boot 3 拦截器搭建教程 以下是基于 Spring Boot 3 的拦截器配置全流程,包含 **登录验证** 和 **接口耗时统计** 两种典型场景的实现。 --- #### 一、核心实现步骤 1. **创建拦截器类** 继承 `HandlerInterceptor` 并覆盖关键方法: ```java import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; public class AuthInterceptor implements HandlerInterceptor { // 控制器方法执行前触发(核心逻辑区) @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getSession().getAttribute("user") == null) { response.sendRedirect("/login"); // 未登录跳转 return false; // 中断请求 } return true; // 放行请求 } // 控制器方法执行后触发(视图渲染前) @Override public void postHandle(...) { // 记录接口耗时起点 } // 请求完全结束后触发(视图渲染完成) @Override public void afterCompletion(...) { // 计算并记录接口总耗时 } } ``` 2. **注册拦截器** 通过 `WebMvcConfigurer` 配置拦截规则: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/api/**") // 拦截路径 .excludePathPatterns("/api/public/**"); // 白名单 } } ``` --- #### 二、进阶功能实现 1. **多拦截器顺序控制** 通过 `order()` 方法设置优先级(值越小优先级越高): ```java registry.addInterceptor(new LogInterceptor()).order(1); registry.addInterceptor(new AuthInterceptor()).order(2); ``` 2. **拦截器注入Spring Bean** 若需在拦截器中使用自动注入: ```java @Component public class RateLimitInterceptor implements HandlerInterceptor { @Autowired private RedisTemplate<String, String> redisTemplate; // 可直接注入 } ``` --- #### 三、拦截器 VS 过滤器差异对比 | 特性 | 拦截器 | 过滤器 | |---------------------|---------------------------------|---------------------------------| | 作用层级 | Spring MVC 层面 | Servlet 容器层面 | | 依赖关系 | 需要Spring上下文支持 | 不依赖Spring | | 控制粒度 | 可精确到HandlerMethod级别 | 仅能控制URL路径 | | 异常处理 | 能获取控制器抛出的异常 | 无法直接获取控制器异常 | | 性能影响 | 平均耗时0.2-0.5ms[^1] | 通常比拦截器更快 | --- #### 四、高频问题解决方案 1. **拦截静态资源问题** 在排除规则中添加静态资源路径: ```java .excludePathPatterns("/css/**", "/js/**", "/images/**") ``` 2. **拦截器内获取请求参数** 使用 `ContentCachingRequestWrapper` 包装请求: ```java String body = new String(requestWrapper.getContentAsByteArray()); ``` --- ```java // 完整配置示例(含参数打印) public class DemoInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("请求URI: " + request.getRequestURI()); System.out.println("请求方法: " + request.getMethod()); return true; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值