Я работаю над веб-приложением на основе Java, JSP, Struts 2 и Waffle для обеспечения безопасности.Я запускаю его в Tomcat 6. Моя проблема в том, что я не могу получить главный объект в своем классе ActionSupport.Чтобы быть более конкретным,
principalProxy.getUserPrincipal()
всегда возвращает ноль.Однако когда я помещаю это в файл .jsp:
request.getUserPrincipal()
, это не возвращает ноль.Таким образом, информация должна быть доступна в исходном объекте HttpServletRequest.Конечно, я пытался вызвать getUserPrincipal () для объекта HttpServletRequest в классе ActionSupport, но это также возвращает ноль.
Мой класс ActionSupport определен как
public class SomeAction extends ActionSupport
implements ServletRequestAware, ServletResponseAware, PrincipalAware {
...
Кроме того, мои распорки.xml определяет действие с набором перехватчиков servlet-config, поэтому метод setPrincipalProxy () действительно вызывается (проверяется операторами print).Это мой struts.xml (сокращенно):
<package name="default" namespace="/" extends="struts-default">
<action name="some" class="com.my.package.SomeAction">
<interceptor-ref name="servlet-config" />
<interceptor-ref name="params">
<param name="excludeParams ">(.*)</param>
</interceptor-ref>
<interceptor-ref name="i18n"/>
<result name="success">/someresult.jsp</result>
</action>
</package>
Файл web.xml определяет фильтр безопасности и сопоставление фильтра, которое должно соответствовать любому URL.Вот соответствующие части:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>
<init-param>
<param-name>principalFormat</param-name>
<param-value>fqn</param-value>
</init-param>
<init-param>
<param-name>roleFormat</param-name>
<param-value>both</param-value>
</init-param>
<init-param>
<param-name>allowGuestLogin</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>securityFilterProviders</param-name>
<param-value>
waffle.servlet.spi.BasicSecurityFilterProvider
waffle.servlet.spi.NegotiateSecurityFilterProvider
</param-value>
</init-param>
<init-param>
<param-name>waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name>
<param-value>
Negotiate
NTLM
</param-value>
</init-param>
<init-param>
<param-name>waffle.servlet.spi.BasicSecurityFilterProvider/realm</param-name>
<param-value>WaffleFilterDemo</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Когда я запрашиваю SomeAction, мне при необходимости предлагается диалоговое окно HTTP Basic Authentication.Это показывает, что SecurityFilter действительно применяется, не так ли?Метод setPrincipalProxy () также вызывается.Я могу получить объект Principal на странице JSP.Так почему объект Principal всегда пуст, когда я пытаюсь получить к нему доступ в SomeAction?
Еще одна вещь, я использую перезапись URL-адреса, на случай, если это может иметь какое-либо отношение к нему.
РЕДАКТИРОВАТЬ: В ответ на запрос batbaatar, настройка запроса в Java.Не может быть намного проще.
@Override
public void setServletRequest(HttpServletRequest request) {
httpRequest = request;
}
Переменная экземпляра httpRequest имеет тип HttpServletRequest.