2012-06-01 2 views
0

Мне нужно реализовать некоторую логику до и после сервлета входа, вызванного моим login.jsp.GateIn: фильтр для сервлета входа

Таким образом, я написал фильтр для URL/логина, чтобы сделать это. Мне нужно, чтобы получить профиль пользователя для некоторых операций, поэтому я создал этот LoginFilter класс:

public class LoginFilter implements Filter { 
    private static Logger logger = Logger.getLogger(LoginFilter.class); 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     String username = httpRequest.getParameter("username"); 
     String password = httpRequest.getParameter("password"); 

     chain.doFilter(request, response); 

     PortalRequestContext context = PortalRequestContext.getCurrentInstance(); 

     if (context == null) 
      logger.info("PortalRequestContext is NULL"); 
     else { 
      String userId = context.getRemoteUser(); 

      if (userId == null || userId.equals("")) 
       logger.info("Login failed, IP:" + httpRequest.getRemoteAddr()); 
      else 
       logger.info("Login executed, username:" + userId); 
     } 
    } 

Проблема заключается в том, что «контекст» (PortalRequestContext) всегда нуль. Что я делаю неправильно? Правильно ли это?

ответ

1

Если вы используете воротав, вы можете попробовать использовать

org.exoplatform.portal.webui.util.Util.getPortalRequestContext().getRequest() 

се

0

Во время входа в систему, PortalRequestContext «s не была создана, но вы можете получить удаленный пользователь по телефону HttpServletRequest#getRemoteUser()

0

Вы можете добавить фильтр GateIN, как подробно here.

И вы можете использовать статически в этом фильтре на ConversationState, чтобы получить текущее имя пользователя:

ConversationState.getCurrent().getIdentity().getUserId();

1

Вы можете разработать клапан и добавить его в контексте файл «портал» веб-приложения (Tomcat/CONF/Каталина/локальный/portal.xml). Вот что делается в воротав для расширения единого входа, например: См ServletAccessValve

ServletAccess.setRequestAndResponse(request, response); 

Затем запрос доступен в SSOLoginModule с помощью этого:

// Tomcat way (Assumed that ServletAccessValve has been configured in context.xml) 
    else 
    { 
    request = ServletAccess.getRequest(); 
    } 

Для JBoss, это более простой, у вас есть просто использовать

javax.security.jacc.PolicyContext.getContext(HttpServletRequest.class.getName()) 
0

Просто используйте объект состояния разговора:

// Gets the current user id 
ConversationState conversationState = ConversationState.getCurrent(); 

org.exoplatform.services.security.Identity identity = conversationState.getIdentity(); 
String userId = identity.getUserId(); 
Смежные вопросы