spring?boot使用拦截器修改请求URL域名?换?IP?访问的方法

 更新时间:2022年09月17日 11:09:20   作者:OAK社区  
Spring Interceptor是一个非常类似于Servlet Filter 的概念 ,这篇文章主要介绍了spring?boot使用拦截器修改请求URL域名?换?IP?访问的相关知识,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

Interceptor 介绍

拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。

你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置…

在 Spring中,当请求发送到 Controller 时,在被Controller处理之前,它必须经过 Interceptors(0或多个)。

Spring Interceptor是一个非常类似于Servlet Filter 的概念 。

Interceptor 作用

日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等;
权限检查:如登录检测,进入处理器检测是否登录;
性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。

自定义 Interceptor

如果你需要自定义 Interceptor 的话必须实现 org.springframework.web.servlet.HandlerInterceptor接口或继承 org.springframework.web.servlet.handler.HandlerInterceptorAdapter类,并且需要重写下面下面 3 个方法:

preHandler(HttpServletRequest request, HttpServletResponse response, Object handler) 方法在请求处理之前被调用。该方法在 Interceptor 类中最先执行,用来进行一些前置初始化操作或是对当前请求做预处理,也可以进行一些判断来决定请求是否要继续进行下去。该方法的返回至是 Boolean 类型,当它返回 false 时,表示请求结束,后续的 Interceptor 和 Controller 都不会再执行;当它返回为 true 时会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候就会调用当前请求的 Controller 方法。
postHandler(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 方法在当前请求处理完成之后,也就是 Controller 方法调用之后执行,但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) 方法需要在当前对应的 Interceptor 类的 postHandler 方法返回值为 true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行。此方法主要用来进行资源清理。

接下来结合实际代码进行学习。

案例1 :域名换IP访问

package com.config;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.support.HttpRequestWrapper;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.IOException;
import java.net.URI;
@Component
public class Interceptor implements ClientHttpRequestInterceptor {
    /**
     * Intercept the given request, and return a response. The given {@link ClientHttpRequestExecution} allows
     * the interceptor to pass on the request and response to the next entity in the chain.
     *
     * <p>A typical implementation of this method would follow the following pattern:
     * <ol>
     * <li>Examine the {@linkplain HttpRequest request} and body</li>
     * <li>Optionally {@linkplain HttpRequestWrapper wrap} the request to filter HTTP attributes.</li>
     * <li>Optionally modify the body of the request.</li>
     * <li><strong>Either</strong>
     * <ul>
     * <li>execute the request using {@link ClientHttpRequestExecution#execute(HttpRequest, byte[])},</li>
     * <strong>or</strong>
     * <li>do not execute the request to block the execution altogether.</li>
     * </ul>
     * <li>Optionally wrap the response to filter HTTP attributes.</li>
     * </ol>
     *
     * @param request   the request, containing method, URI, and headers
     * @param body      the body of the request
     * @param execution the request execution
     * @return the response
     * @throws IOException in case of I/O errors
     */
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        String str = request.getURI().toString();
        String str1 = str.replace("https://baidu.com", "http://39.156.66.10:8080");
        URI newUri = UriComponentsBuilder.fromUri(URI.create(str)).build().toUri();
         return execution.execute(new UriModifyHttpRequestWrapper(request, newUri), body);
    }
    private static class UriModifyHttpRequestWrapper extends HttpRequestWrapper {
        private final URI uri;
        public UriModifyHttpRequestWrapper(HttpRequest request, URI uri) {
            super(request);
            this.uri = uri;
        }
        @Override
        public URI getURI() {
            return uri;
        }
    }
}

案例2: erverWebExchange通过拦截器修改请求url

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
{
    ServerHttpRequest str = exchange.getRequest();
    //新url
    String newPath ="/system/loanOrg/list";
    ServerHttpRequest newRequest = str.mutate().path(newPath).build();
    exchange.getAttributes().put("path", newRequest.getURI());
    return chain.filter(exchange.mutate() .request(newRequest).build());
}

案例3: 将请求路径中/idea都去掉

1.定义拦截器

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
@Component
public class GlobalInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpServletResponseWrapper httpResponse = new HttpServletResponseWrapper((HttpServletResponse) response);
        System.out.println(request.getRequestURI());
        String path=request.getRequestURI();
        if(path.indexOf("/idea")>-1){
            path = path.replaceAll("/idea","");
            request.getRequestDispatcher(path).forward(request,response);
        }
 
        return true;
    }
}

2.定义WebMvcConfig

import com.GlobalInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    GlobalInterceptor globalInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(globalInterceptor).addPathPatterns("/idea/**");
    }
} 

案例4: SpringBoot 利用过滤器Filter修改请求url地址

要求:

代码中配置的url路径为http://127.0.0.1/api/asso

现在要求http://127.0.0.1/asso 也可以同样访问同一个conroller下面的method,并且要求参数全部跟随

代码:

package com.framework.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
 * 修改请求路由,当进入url为/a/b时,将其url修改为/api/a/b
 *  
 **/
public class UrlFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest)request;
        HttpServletResponseWrapper httpResponse = new HttpServletResponseWrapper((HttpServletResponse) response);
        System.out.println(httpRequest.getRequestURI());
        String path=httpRequest.getRequestURI();
        if(path.indexOf("/api/")<0){
            path="/api"+path;
            System.out.println(path);
            httpRequest.getRequestDispatcher(path).forward(request,response);
        }
       else {
            chain.doFilter(request,response);

        }
        return;
    }
}


这个类必须继承Filter类,这个是Servlet的规范。有了过滤器类以后,以前的web项目可以在web.xml中进行配置,但是spring boot项目并没有web.xml这个文件,那怎么配置?在Spring boot中,我们需要FilterRegistrationBean来完成配置。

其实现过程如下:

package com.shitou.huishi.framework.filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * Created by qhong on 2018/5/16 15:28
 **/
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean registFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new UrlFilter());
        registration.addUrlPatterns("/*");
        registration.setName("UrlFilter");
        registration.setOrder(1);
        return registration;
    }
}

案例5.拦截器: WebMvcConfigurerAdapter拦截器

拦截所有请求

	@Configuration
	public class CustMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
    @Autowired
    private CustInterceptor custInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(custInterceptor).addPathPatterns("/**");
    }
}
排除指定路径

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(custInterceptor).addPathPatterns("/**").excludePathPatterns("/select/**");
    }

拦截指定路径

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(custInterceptor).addPathPatterns("/user/**");
}

CustInterceptor具体拦截类

@Component
public class CustInterceptor extends HandlerInterceptorAdapter {
	   @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        boolean needLogin = needLogin(request);
        if (!needLogin) {
            return true;
        }
        boolean isLogin = checkLogin(request, response);
        return isLogin;
    }
}

结语

到此这篇关于spring boot使用拦截器修改请求URL域名 换 IP 访问的文章就介绍到这了,更多相关spring boot拦截器修改请求URL域名内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Java实现CSV格式转对象

    Java实现CSV格式转对象

    csv全称“Comma-Separated Values”,是一种逗号分隔值格式的文件,常用来存储数据的纯文本格式文件。本文将用Java语言实现CSV转对象,需要的可以参考一下
    2022-06-06
  • 如何使用Playwright对Java API实现自动视觉测试

    如何使用Playwright对Java API实现自动视觉测试

    这篇文章主要介绍了如何使用Playwright对Java API实现自动视觉测试,帮助大家更好的理解和使用Playwright,感兴趣的朋友可以了解下
    2021-01-01
  • Maven 打包项目到私服 (deploy)的配置方法

    Maven 打包项目到私服 (deploy)的配置方法

    这篇文章主要介绍了Maven 打包项目到私服 (deploy)的配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 通过Java 程序获取Word中指定图片的坐标位置

    通过Java 程序获取Word中指定图片的坐标位置

    本文介绍通过Java程序获取Word文档中指定图片的坐标位置,程序运行环境是jdk1.8开发环境idea,通过java程序代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-05-05
  • java多线程的同步方法实例代码

    java多线程的同步方法实例代码

    这篇文章主要介绍了 java多线程的同步方法实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • vscode开发maven的javaweb项目并部署到tomcat及配置指南

    vscode开发maven的javaweb项目并部署到tomcat及配置指南

    这篇文章主要给大家介绍了关于vscode开发maven的javaweb项目并部署到tomcat及配置的相关资料,在vscode中创建maven项目,需要逐一操作下面的环节,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 解决使用mybatis-plus时,生成的SQL大写变小写加下划线问题

    解决使用mybatis-plus时,生成的SQL大写变小写加下划线问题

    这篇文章主要介绍了解决使用mybatis-plus时,生成的SQL大写变小写加下划线问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java编程使用箱式布局管理器示例【基于swing组件】

    Java编程使用箱式布局管理器示例【基于swing组件】

    这篇文章主要介绍了Java编程使用箱式布局管理器,结合实例形式分析了基于swing组件的箱式布局管理器定义与使用技巧,需要的朋友可以参考下
    2018-01-01
  • 详解Java中List接口底层实现原理

    详解Java中List接口底层实现原理

    Java是一种广泛应用的编程语言,被广泛应用于各种平台和应用领域,List接口是Java中最重要的数据结构之一,它为我们提供了一种灵活、高效、可扩展的数据结构,本篇文章将首先介绍Java中List接口的基本特性和使用方法,然后深入研究List接口的底层实现原理
    2023-11-11
  • 基于springboot设置Https请求过程解析

    基于springboot设置Https请求过程解析

    这篇文章主要介绍了基于springboot设置Https请求过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论

?


http://www.vxiaotou.com