簡體   English   中英

Spring Security OAuth2中的JSON請求無法運行tomcat 9

[英]JSON Request in Spring security OAuth2 not working tomcat 9

關注帖子,將請求更改為json。

我的配置

過濾:

@Component
@Order(value = Integer.MIN_VALUE)
public class JsonToUrlEncodedAuthenticationFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {
        if (Objects.equals(request.getContentType(), "application/json") && Objects.equals(((RequestFacade) request).getServletPath(), "/oauth/token")) {
            InputStream is = request.getInputStream();
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();

            int nRead;
            byte[] data = new byte[16384];

            while ((nRead = is.read(data, 0, data.length)) != -1) {
                buffer.write(data, 0, nRead);
            }
            buffer.flush();
            byte[] json = buffer.toByteArray();

            HashMap<String, String> result = new ObjectMapper().readValue(json, HashMap.class);
            HashMap<String, String[]> r = new HashMap<>();
            for (String key : result.keySet()) {
                String[] val = new String[1];
                val[0] = result.get(key);
                r.put(key, val);
            }

            String[] val = new String[1];
            val[0] = ((RequestFacade) request).getMethod();
            r.put("_method", val);

            HttpServletRequest s = new MyServletRequestWrapper(((HttpServletRequest) request), r);
            chain.doFilter(s, response);
        } else {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    }
}

請求包裝器:

public class MyServletRequestWrapper extends HttpServletRequestWrapper {
    private final HashMap<String, String[]> params;

    public MyServletRequestWrapper(HttpServletRequest request, HashMap<String, String[]> params) {
        super(request);
        this.params = params;
    }

    @Override
    public String getParameter(String name) {
        if (this.params.containsKey(name)) {
            return this.params.get(name)[0];
        }
        return "";
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        return this.params;
    }

    @Override
    public Enumeration<String> getParameterNames() {
        return new Enumerator<>(params.keySet());
    }

    @Override
    public String[] getParameterValues(String name) {
        return params.get(name);
    }
}

上面的配置在Spring Boot嵌入式tomcat中工作。 不幸的是,當我調試過濾器時,它在tomcat 9.0.1中不起作用,它一次獲取值並將其傳遞給doFilter(),從那里再次循環,下次獲取錯誤

錯誤boot.web.support.ErrorPageFilter-由於發生異常而從請求[/ oauth / token]轉發到錯誤頁面[由於輸入結束,無法映射任何內容]

由於json而導致的第二循環不存在,但是當使用springboot時,它不會進入第二循環。

任何建議使其也可以在springboot和獨立的tomcat中工作。

問題是“ springSecurityFilterChain”的重復過濾器注冊

Spring啟動從一開始就啟動,我的代碼也嘗試手動注冊springSecurityFilterChain擴展

AbstractSecurityWebApplicationInitializer.class

刪除后,它可以在Spring Boot以及獨立的tomcat中工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM