Метод PostConstruct не будет вызываться после входа в систему

В нашем приложении у нас есть панель инструментов, которая будет загружена после входа в систему из метода init() с аннотацией PostConstruct.

Все работает нормально, пока сессия не истечет. В этот момент, если я нажму кнопку на панели инструментов, этот метод инициализации будет вызван снова, хотя я не вошел в систему. Я буду перенаправлен на страницу входа, и теперь, если я войду, метод PostConstruct не будет больше не будет вызываться, и содержимое информационной панели не может быть загружено.

Я знаю, что PostConstruct будет вызываться только один раз после создания сеанса (класс Controller — @SessionScoped). Я предполагаю, что проблема в том, что сервер создает новый сеанс после тайм-аута, потому что метод инициализации вызывается после тайм-аута и до входа в систему, и это приводит к тому, что после входа в систему не вызывается снова. Что было бы лучшим решением для решения этой проблемы?

Одним из обходных путей может быть загрузка содержимого информационной панели в метод, который не аннотирован с помощью PostConstruct. Но мне интересно, можно ли решить проблему по-другому.


person nolazem    schedule 27.11.2017    source источник
comment
Начните с того, что выясните, как это называется, и попытайтесь понять, что   -  person Kukeltje    schedule 28.11.2017


Ответы (1)


Вы можете реализовать фильтр сервлета для отслеживания состояния ваших пользовательских сеансов. Таким образом, вы обнаружите сеанс с истекшим сроком действия из управляемого компонента, и метод init не будет вызываться.

Этот фильтр может выглядеть так:

public class UriFilter implements javax.servlet.Filter {
    @Inject SessionController session;
    private static final String SIGNON_PAGE_URI = "/myappname/engine/index.xhtml";
    private static final String SUBDOMAIN_URI = "/myappname/engine/";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse)response;  
        HttpServletRequest req = (HttpServletRequest )request;  
        String uri = ((HttpServletRequest) request).getRequestURI();
        if( !this.authorize(req ) && !(uri.endsWith("/") || uri.endsWith("index.xhtml") || !uri.endsWith(".xhtml")) ){ 
            if(request.getParameter("fileName") != null)
                res.sendRedirect(SIGNON_PAGE_URI+"?uri="+uri.substring(SUBDOMAIN_URI.length(), uri.length())+"?fileName="+request.getParameter("fileName"));
            else {
                res.setHeader("Cache-Control","no-cache, no-store, must-revalidate");  
                res.setHeader("Pragma","no-cache");  
                res.setDateHeader("Expires",0); 
                res.sendRedirect(SIGNON_PAGE_URI+"?faces-redirect=true");
            }
        } else{  
            //Desativa o cache do browser  
            res.setHeader("Cache-Control","no-cache, no-store, must-revalidate");  
            res.setHeader("Pragma","no-cache");  
            res.setDateHeader("Expires",0); 
            //Processa request e response  
            chain.doFilter( req, res );  
        }


    }

    private boolean authorize( HttpServletRequest req ){  
        boolean authorized = false;  
        HttpSession session = req.getSession(false);         
        if(session != null){  
            if(this.session != null) {
                if(this.session.getLogged() != null) {
                    authorized = true;
                }
            }   
        }  
        return authorized;  
    }

    @Override
    public void destroy() {

    }


}

SessionController — это @SessionScoped, который отслеживает зарегистрированного пользователя.

В вашем файле web.xml вы должны указать фильтр:

    <filter>
        <filter-name>URI Filter</filter-name>
        <filter-class>com.myappname.filter.UriFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>URI Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/engine/*</url-pattern>
    </filter-mapping>
person Yamada    schedule 27.11.2017