Spring boot 修改进入控制器的请求头和离开Spring Boot控制器的响应头

Spring boot 修改进入控制器的请求头和离开Spring Boot控制器的响应头,spring-boot,servlets,spring-restcontroller,Spring Boot,Servlets,Spring Restcontroller,这感觉应该是一件简单的事情,但我对SpringBoot和整个Servlet生态系统还是相当陌生的,所以还不太清楚。我希望有一个类似于HandlerInterceptor的接口,允许我在控制器中完成后修改请求和响应对象。更好的做法是修饰映射注释,这样我可以指定哪些控制器需要该操作 我现在要解决的问题是,尽管我预计将来会扩展它,但我的应用程序中有一个加密的头文件,我想对它进行解密,以便在控制器中使用,然后在退出时再次加密 编辑:为了清晰 我有一个rest控制器,类似于: @RestContr

这感觉应该是一件简单的事情,但我对SpringBoot和整个Servlet生态系统还是相当陌生的,所以还不太清楚。我希望有一个类似于HandlerInterceptor的接口,允许我在控制器中完成后修改请求和响应对象。更好的做法是修饰映射注释,这样我可以指定哪些控制器需要该操作

我现在要解决的问题是,尽管我预计将来会扩展它,但我的应用程序中有一个加密的头文件,我想对它进行解密,以便在控制器中使用,然后在退出时再次加密

编辑:为了清晰

我有一个rest控制器,类似于:

    @RestController
        public class PojoService {
            @GetMapping(value = "/path/to/resource")
                public ResponseEntity<SomeClass> getLocationData(
@RequestHeader(value = "EncryptedHeader", required = false) String ecryptedHeaderValue) {
                    DecryptionObject decryptedHeader = new DecryptionObject(pageHeaderValue);
                    SomePojo result = getResult();
                    return decryptedHeader.decorateResponseWithEncryptedHeader(result);
                }
    }
    @RestController
        public class PojoService {
            @GetMapping(value = "/path/to/resource", decryptHeader="EncryptedHeader")
                public ResponseEntity<SomeClass> getLocationData(
@RequestHeader(value = "EncryptedHeader", required = false) String decryptedHeaderValue) {
                    SomePojo result = getResult();
                    return result;
                }
    }
@RestController
公共类PojoService{
@GetMapping(value=“/path/to/resource”)
公共响应getLocationData(
@RequestHeader(value=“EncryptedHeader”,required=false)字符串ecryptedHeaderValue){
DecryptionObject decryptedHeader=新的DecryptionObject(pageHeaderValue);
SomePojo result=getResult();
返回decryptedHeader.decorateResponseWithEncryptedHeader(结果);
}
}
我不希望在每个映射上都有DecryptionObject,而是在我开始映射之前,我通过一些过滤器或钩子对头进行解密,然后在退出时重新加密头。然后我的代码看起来像:

    @RestController
        public class PojoService {
            @GetMapping(value = "/path/to/resource")
                public ResponseEntity<SomeClass> getLocationData(
@RequestHeader(value = "EncryptedHeader", required = false) String ecryptedHeaderValue) {
                    DecryptionObject decryptedHeader = new DecryptionObject(pageHeaderValue);
                    SomePojo result = getResult();
                    return decryptedHeader.decorateResponseWithEncryptedHeader(result);
                }
    }
    @RestController
        public class PojoService {
            @GetMapping(value = "/path/to/resource", decryptHeader="EncryptedHeader")
                public ResponseEntity<SomeClass> getLocationData(
@RequestHeader(value = "EncryptedHeader", required = false) String decryptedHeaderValue) {
                    SomePojo result = getResult();
                    return result;
                }
    }
@RestController
公共类PojoService{
@GetMapping(value=“/path/to/resource”,decryptHeader=“EncryptedHeader”)
公共响应getLocationData(
@RequestHeader(value=“EncryptedHeader”,required=false)字符串decryptedHeaderValue){
SomePojo result=getResult();
返回结果;
}
}

我发现HandlerInterceptor无法工作,因为我无法修改interceptor中的请求或响应。希望这能澄清问题。

您仍然可以使用HandlerInterceptor。创建实现HandlerInterceptor(或扩展HandlerInterceptorAdapter)的类,然后使用另一个扩展的类注册它

您还可以使用过滤器来完成此操作-创建过滤器类并通过声明FilterRegistrationBean类型的
@Bean
来注册它-这还允许您限制某些路径

更新:您可以使用可由拦截器设置的请求属性(
request.setAttribute(“decryptedHeaderValue”)来完成此操作
。或者,如果您特别喜欢使用标题,则筛选器更适合您的用途。创建一个新的包装请求类型,该类型包装传入请求并执行任何您想要的操作,然后将此包装传递给链中的下一个筛选器

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    [...]
    HttpServletRequestWrapper decryptedRequest = new HttpServletRequestWrapper((HttpServletRequest) request) {
       public String getHeader(String name) {
            if (name.equals("DecryptedHeader")) {
                  String encrypted = super.getHeader("EncryptedHeader");
                  String decrypted = decrypt(encrypted);
                  return decrypted;
            }
            return super.getHeader(name); //Default behavior
       }
   }


   chain.doFilter(decryptedRequest, response); //Pass on the custom request down
}
然后任何类(其他筛选器、控制器等)都可以调用
request.getHeader(“DecryptedHeader”)
来检索解密的头。这只是许多类似方法之一。注册时可以限制此筛选器执行的路径


对于响应,有一个类似的类HttpServletResponseWrapper,可用于自定义。

您仍然可以使用HandlerInterceptor。创建实现HandlerInterceptor(或扩展HandlerInterceptorAdapter)的类,然后使用另一个扩展的类注册它

您还可以使用过滤器来完成此操作-创建过滤器类并通过声明FilterRegistrationBean类型的
@Bean
来注册它-这还允许您限制某些路径

更新:您可以使用可由拦截器设置的请求属性(
request.setAttribute(“decryptedHeaderValue”)来完成此操作
。或者,如果您特别喜欢使用标题,则筛选器更适合您的用途。创建一个新的包装请求类型,该类型包装传入请求并执行任何您想要的操作,然后将此包装传递给链中的下一个筛选器

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
    [...]
    HttpServletRequestWrapper decryptedRequest = new HttpServletRequestWrapper((HttpServletRequest) request) {
       public String getHeader(String name) {
            if (name.equals("DecryptedHeader")) {
                  String encrypted = super.getHeader("EncryptedHeader");
                  String decrypted = decrypt(encrypted);
                  return decrypted;
            }
            return super.getHeader(name); //Default behavior
       }
   }


   chain.doFilter(decryptedRequest, response); //Pass on the custom request down
}
然后任何类(其他筛选器、控制器等)都可以调用
request.getHeader(“DecryptedHeader”)
来检索解密的头。这只是许多类似方法之一。注册时可以限制此筛选器执行的路径


对于响应,有一个类似的类HttpServletResponseWrapper,您可以使用它进行定制。

我们可以通过在
拦截器中添加属性来实现这一点


httpServletRequest.setAttribute(,);

我们可以通过在
拦截器中添加属性来实现这一点


httpServletRequest.setAttribute(,)

请澄清您的具体问题或添加其他详细信息以突出显示您所需的内容。由于该文件目前已编写,因此很难准确说出您的要求。请澄清您的具体问题或添加其他详细信息以突出显示您所需的内容。由于该文件目前已编写,因此很难准确说出您的要求g、 感谢您的回复,我已尝试起诉HandlerInterceptor,因此我熟悉您发布的语法,请求和响应在拦截器中是不可变的,我需要更改头值。感谢您的回复,我已尝试起诉HandlerInterceptor,因此我熟悉您发布的语法、请求和响应nse在拦截器中是不可变的,我需要更改头值。