2017-12-06 1 views
1

私はOncePerRequestFilterクラスのを拡張スプリングセキュリティでフィルタを開発していとその注釈@RequestHeaderとヘッダによって入力されたRESTサービス.Parametersのパラメータを更新しなければなりません。Springセキュリティでフィルタからヘッダパラメータを更新するには?

私はクラス次のとフィルタからパラメータを更新しようとした

public class HeaderMapRequestWrapper extends HttpServletRequestWrapper { 
    /** 
    * construct a wrapper for this request 
    * 
    * @param request 
    */ 
    public HeaderMapRequestWrapper(HttpServletRequest request) { 
     super(request); 
    } 

    private Map<String, String> headerMap = new HashMap<String, String>(); 

    /** 
    * add a header with given name and value 
    * 
    * @param name 
    * @param value 
    */ 
    public void addHeader(String name, String value) { 
     headerMap.put(name, value); 
    } 

    public void removeteHeader(String name){ 
     headerMap.remove(name); 
    } 
    @Override 
    public String getHeader(String name) { 
     String headerValue = super.getHeader(name); 
     if (headerMap.containsKey(name)) { 
      headerValue = headerMap.get(name); 
     } 
     return headerValue; 
    } 

    /** 
    * get the Header names 
    */ 
    @Override 
    public Enumeration<String> getHeaderNames() { 
     List<String> names = Collections.list(super.getHeaderNames()); 
     for (String name : headerMap.keySet()) { 
      names.add(name); 
     } 
     return Collections.enumeration(names); 
    } 

    @Override 
    public Enumeration<String> getHeaders(String name) { 
     List<String> values = Collections.list(super.getHeaders(name)); 
     if (headerMap.containsKey(name)) { 
      values.add(headerMap.get(name)); 
     } 
     return Collections.enumeration(values); 
    } 

} 

そして方法.addHeader("parameter", "New value")とを、私はメソッドのパラメータを読んだとき、それは変更しましたが、からそれを読めばしていません.getHeader( "parameter")メソッドHttpServletRequestクラスから、私は同じメソッドクラスでinyectedを持っています。変更は行われますが、メソッドのパラメータには表示されません。

方法は、以下である:

@Autowired 
HttpServletRequest a; 


//Annotations @GetMapping...... 
public void method (@RequestHeader(value="Parameter") String parameter){ 
     System.out.print(parameter); //Parameter did not change 
     system.out.print(a.getHeader("parameter")); //Parameter changed. 
} 

は、誰かがフィルタから?、または他の方法からの動作パラメータを変更する方法を知っている....

答えて

1

私が何かわかりません間違っていますが、セットアップで試してみるとうまくいくようです。次のコードを見てください。

/** 
* username: test, password: test 
* Added Header: param 
* REST URL: http://localhost:8080/hello 
*/ 

package com.test; 

import java.io.IOException; 
import java.util.Collections; 
import java.util.Enumeration; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletRequestWrapper; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.stereotype.Component; 
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.RequestHeader; 
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.filter.OncePerRequestFilter; 

@SpringBootApplication 
public class TestRequestWrapperApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(TestRequestWrapperApplication.class, args); 
    } 
} 

@Component 
class RequestWrapperFilter extends OncePerRequestFilter { 
    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 
     HeaderMapRequestWrapper wrappedRequest = new HeaderMapRequestWrapper((HttpServletRequest)request); 
     wrappedRequest.addHeader("param", "Hello World!"); 

     filterChain.doFilter(wrappedRequest, response); 
    } 
} 

@RestController 
class TestRest { 
    @GetMapping("hello") 
    public String hello(@RequestHeader("param") String param) { 
     return "param: " + param; 
    } 
} 

@Configuration 
class SecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     super.configure(http); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.inMemoryAuthentication().withUser("test").authorities("test").password("test"); 
    } 
} 

class HeaderMapRequestWrapper extends HttpServletRequestWrapper { 
    public HeaderMapRequestWrapper(HttpServletRequest request) { 
     super(request); 
    } 

    private Map<String, String> headerMap = new HashMap<String, String>(); 

    public void addHeader(String name, String value) { 
     headerMap.put(name, value); 
    } 

    public void removeteHeader(String name) { 
     headerMap.remove(name); 
    } 

    @Override 
    public String getHeader(String name) { 
     String headerValue = super.getHeader(name); 
     if (headerMap.containsKey(name)) { 
      headerValue = headerMap.get(name); 
     } 
     return headerValue; 
    } 

    @Override 
    public Enumeration<String> getHeaderNames() { 
     List<String> names = Collections.list(super.getHeaderNames()); 
     for (String name : headerMap.keySet()) { 
      names.add(name); 
     } 
     return Collections.enumeration(names); 
    } 

    @Override 
    public Enumeration<String> getHeaders(String name) { 
     List<String> values = Collections.list(super.getHeaders(name)); 
     if (headerMap.containsKey(name)) { 
      values.add(headerMap.get(name)); 
     } 
     return Collections.enumeration(values); 
    } 

} 
+0

パラメータヘッダーが非常に長く、それがbase64であり、addHeaderメソッドを使用したときに新しい値が古いものに連結され、気づく。 解決策は、HeaderMapRequestWrapperクラスのgetHeadersメソッドを行コード 'values.clear()'で更新しました ありがとうございました。 –

関連する問題