【问题标题】:JSON Request in Spring security OAuth2 not working tomcat 9Spring security OAuth2中的JSON请求不起作用tomcat 9
【发布时间】:2018-04-22 00:37:45
【问题描述】:

已关注this 发帖,将请求更改为 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(),从那里再次循环,下次它得到错误

ERROR boot.web.support.ErrorPageFilter - 转发到错误页面 请求[/oauth/token] 由于异常[没有要映射的内容,因为 输入结束]

由于 json 在第二个循环中不存在,但是当使用 springboot 时它不会进入第二个循环。

任何让它在 springboot 以及独立的 tomcat 中工作的建议。

【问题讨论】:

  • 这个问题与 Spring Security 有什么关系?这是一个关于Spring Boot、Servlet和Tomcat的问题。

标签: java spring tomcat spring-security spring-boot-actuator


【解决方案1】:

问题是重复过滤器注册 'springSecurityFilterChain'

。 Spring boot一开始就启动一次,我的代码也尝试注册springSecurityFilterChain手动扩展

AbstractSecurityWebApplicationInitializer.class

,这会导致问题。删除它后,它可以在 spring boot 以及独立的 tomcat 中工作。

【讨论】:

    猜你喜欢
    • 2020-10-20
    • 2014-07-27
    • 2020-07-17
    • 2016-07-19
    • 2014-11-05
    • 2018-06-02
    • 2014-08-31
    • 2014-06-12
    • 2018-02-05
    相关资源
    最近更新 更多