【问题标题】:How to forward to a wicket page from a spring filter?如何从弹簧过滤器转发到检票口页面?
【发布时间】:2021-08-17 07:33:16
【问题描述】:

我正在做一个框架(使用 Java、Spring Boot 和 Apache Wicket)来快速启动一个网站。即使开发人员正在从框架中覆盖默认主页,我也想强制用户在第一次启动时更改管理员密码。

我认为显示更改默认密码的表单的最佳方法是使用服务器过滤器。我使用@Component 注释创建了一个过滤器,如果密码尚未更改,我正在做这样的转发:

request.getRequestDispatcher("/changePassword").forward(request, response);

我认为问题是 Spring 不知道这个资源,最后,做一个 404 错误页面。这里是日志:

2021-08-17 09:30:01.583 DEBUG 23688 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : "FORWARD" dispatch for GET "/changePassword", parameters={}
2021-08-17 09:30:01.590 DEBUG 23688 --- [nio-8080-exec-2] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped to ResourceHttpRequestHandler [Classpath [META-INF/resources/], Classpath [resources/], Classpath [static/], Classpath [public/], ServletContext [/]]
2021-08-17 09:30:01.593 DEBUG 23688 --- [nio-8080-exec-2] o.s.w.s.r.ResourceHttpRequestHandler     : Resource not found
2021-08-17 09:30:01.593 DEBUG 23688 --- [nio-8080-exec-2] w.c.HttpSessionSecurityContextRepository : Did not store anonymous SecurityContext
2021-08-17 09:30:01.594 DEBUG 23688 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Exiting from "FORWARD" dispatch, status 404

我该如何解决这个问题?

谢谢。

编辑

这里是过滤器:

@Component
@Order(1)
public class ChangeAdminPasswordFilter implements Filter {

    @Autowired
    private SettingService settingService;

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
            throws IOException, ServletException {

        if (!settingService.isAdminPasswordChanged()) {
request.getRequestDispatcher("/changePassword").forward(request, response);
        }

        chain.doFilter(request, response);
    }
}

编辑 2

这里是 Wicket 页面的代码:

@MountPath("changePassword")
public class ChangeAdminPasswordPage extends WebPage {

    private static final long serialVersionUID = 1L;

    public ChangeAdminPasswordPage() {
    }
}

【问题讨论】:

  • 请向我们提供有关 web.xml 配置中映射的更多信息。
  • @martin-g 这是一个 Spring Boot webapp:没有 web.xml。
  • web.xml、注册 bean、@webservlet 等等
  • 我没有设置过滤器的映射,因为它必须在所有 URL 上调用。也许以后我会为 CSS、JS、图像添加一些规则。目前,它只是一个 POC。过滤器被完美调用,但转发不起作用。

标签: java spring-boot wicket


【解决方案1】:

当您将 Wicket 与 Spring Boot 一起使用时 - Spring DispatcherServlet 处理控制器上定义的映射,以将请求路由到适当的控制器方法。然而,Wicket 生成的响应由 WicketServlet/WicketFilter 处理(WicketServlet 将所有工作委托给 WicketFilter)。要使用 Wicket 处理某个 url,它应该与 WicketFilter 正在侦听的路径匹配。您需要更改 WicketFilter 以侦听不同于 Spring Boot DispatcherServlet 的路径。

【讨论】:

  • 好的,我想我会搜索另一个解决方案,因为我想避免更改默认的 Wicket 设置。
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多