Перехватывает запрос в фильтре сервлетов и условно возвращает ответ отправителю - PullRequest
2 голосов
/ 11 августа 2011

Мне нужна помощь с фильтрами сервлетов.

На данный момент у нас есть сервлет ChangePassword для Oracle SSO.Я хочу перехватить любой вызов этого сервлета и попытаться вернуть ответ отправителю (сменить пароль jsp), если моя проверка не удалась.Кроме того, если все мои проверки в порядке, я передам запрос сервлету ChangePassword.Одним из требований для этого фильтра является сохранение исходных параметров и повторная отправка их на исходную страницу JSP в случае сбоя любой из моих проверок.

Текущий метод doFilter:

public void doFilter(ServletRequest request, ServletResponse response, 
                     FilterChain chain) throws IOException, 
                                               ServletException {


    // __TB__ 2009_11_06 added for customization
    String str_old_password = null;
    String str_new_password = null;
    String str_new_password_confirm = null;
    String str_action = null;
    String str_user = request.getParameterValues("p_username")[0];


    // __TB__ 2009_11_06 added for customization
    // Get the old password value
    try {
        str_old_password = request.getParameterValues("p_old_password")[0];
    } catch (Exception e) {
        str_old_password = "";
        logger.error("Problem s dohvaćanjem starog passworda za username: " + 
                     str_user);
        throw new IOException();
    }

    // Get the new password
    try {
        str_new_password = request.getParameterValues("p_new_password")[0];
    } catch (Exception e) {
        str_new_password = "";
        logger.error("Problem s dohvaćanjem novog passworda za username: " + 
                     str_user);
        throw new IOException();
    }

    // Get the new password confrimantion string
    try {
        str_new_password_confirm = 
                         request.getParameterValues("p_new_password_confirm")[0];
    } catch (Exception e) {
        str_new_password_confirm = "";
        logger.error("Problem s dohvaćanjem potvrde novog passworda za username: " + 
                     str_user);
        throw new IOException();
    }

    // Get the action string
    try {
        str_action = request.getParameterValues("p_action")[0];
    } catch (Exception e) {
        str_action = "OK";
    }

    if (logger.isDebugEnabled()) {
        logger.debug("Ulazak u RuPassFilter-doFilter za username: " + 
                     str_user);
    }

    // Prevent update if passwords are not equal and action is not equal OK
    if (str_new_password.toString().equals(str_new_password_confirm.toString()) && 
        str_action.equals("OK")) {
        try {
            if (logger.isDebugEnabled()) {
                logger.debug("Novi password i njegova potvrda odgovaraju jedno drugom za username: " + 
                             str_user);
            }
            //Run update and on any exception pass request to password change servlet except on MyException
            MyChecker mc = new MyChecker();

            if (logger.isDebugEnabled()) {
                logger.debug("Poziv check metode u RuPassFilter-u za username: " + 
                             str_user);
            }
            mc.check (str_user, str_old_password, str_new_password, 
                        _filterConfig.getServletContext());
            if (logger.isDebugEnabled()) {
                logger.debug("Odrađena check metoda u RuPassFilter-u za username: " + 
                             str_user);
            }
            //pass to servlet
            chain.doFilter(request, response);

        } catch (UtilException ue) {
            logger.error("Dogodio se UtileException za username: " + 
                         str_user);
            logger.error(ue.getLocalizedMessage());

            chain.doFilter(request, response);

        } catch (NamingException ne) {
            logger.error("Dogodio se NamingException za username: " + 
                         str_user);
            logger.error(ne.getLocalizedMessage());

            chain.doFilter(request, response);

        } catch (IOException ioe) {
            logger.error("Dogodio se IOException u RuPassFilter-u za username: " + 
                         str_user);
            logger.error(ioe.getLocalizedMessage());

            throw ioe;
        } catch (MyException me) {
            logger.error("Dogodio se MyException u RuPassFilter-u za username: " + 
                         str_user);
            logger.error(me.getLocalizedMessage());

            //!!!!!!!!!!!!
            // At this point I need return response back to sender !!!!!!!!!!!!
            //!!!!!!!!!!!!!
        }
    } else {
        if (logger.isDebugEnabled()) {
            logger.debug("Passwordi ne odgovraju jedna drugom ili je action različit od OK u RuPassFilter-u za username: " + 
                         str_user);

        }
        //!!!!!!!!!!!!
        // At this point I need return response back to sender !!!!!!!!!!!!
        //!!!!!!!!!!!!!
    }

    // Everything is OK
    chain.doFilter(request, response);
}

Метод MyCheck.checkвыдает MyException в случае сбоя любой из моих проверок.

Наш J2EE-сервер - OC4J в версии: 10.1.2.0.2

1 Ответ

4 голосов
/ 11 августа 2011

Вы можете использовать RequestDispatcher

RequestDispatcher rd = request.getRequestDispatcher("path_for_initial_jsp_page"); try{<br> MyCheck.check();<br> }catch(MyException me){<br> logger.error(me.getLocalizedMessage());<br> rd.include(request, response);<br> }

RequestDispatcher.forward (): Как только вы перенаправляете запрос, скажем, Servlet A на любой другой элемент управления Servlet / JSP, он передается из Servlet A в переадресованное patrty и никогда не возвращается обратно в A для этого запроса.

RequestDispatcher.include (): Включите то, что вы делаете, если Servlet A (приведенный выше пример) включает в себя ответ другого Servlet / JSP (скажем, B или B.jsp), так что на мгновение управление переходит к B или B.jsp (они генерируют ответ) назад к A & сгенерированный ответ добавлен в Ответ A.

...