【发布时间】:2016-01-02 00:54:57
【问题描述】:
我正在构建一个由 tomcat 提供服务的 Web 应用程序(使用 servlet api 2.4,目前无法切换到 servlet api 3.0)。 我正在尝试使用 HttpServletRequest.isUserInRole 动态保护某个 url 模式。
我有多个使用 web.xml 文件保护的 servlet:
<servlet-mapping>
<servlet-name>MySecuredServlet</servlet-name>
<url-pattern>/my/secured/servlets/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyDispatcher</servlet-name>
<!-- This servlet won't be secured because only some of the servlets this dispatcher calls will be secured -->
<url-pattern>/my/dispatcher/*</url-pattern>
</servlet-mapping>
...
<security-constraint>
<web-resource-collection>
<url-pattern>/my/secured/servlets/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
我还有一些其他 servlet,我无法在 web.xml 文件中写入,因为我在构建时不知道它们。
我正在向一些动态设置的 servlet 发送请求,其中一些需要授权。
class MyDispatcher extends HttpServlet {
...
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
// I am dispatching requests to dynamically set customServlets which I don't know at build time
MyCustomServlet customServlet = MyCustomServlets.get(req.getPathInfo());
if (customServlet != null) {
if (customServlet.requiresAuthorization()) {
// isUserInRole is not reliable. It returns false when it should return true. Why?
if (!req.isUserInRole(ADMIN_ROLE_NAME)) {
resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
}
customServlet.doGet(req, resp);
}
}
}
进一步说明:
在 url-pattern /admin 我提供一个在 web.xml 文件中受保护的页面。
我从该页面向动态 servlet 发出 XMLHttpRequests,我希望 isUserInRole 方法返回 true,因为用户在访问 /admin强>最初。
但 isUserInRole 为所有请求返回 false,直到我在浏览器中刷新 /admin 页面。为什么会这样?我该如何解决?
【问题讨论】:
标签: java tomcat jakarta-ee servlets resteasy