【发布时间】: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