Struts2: метод actionInvocation.invoke () выдает исключение нулевого указателя - PullRequest
0 голосов
/ 03 февраля 2012

В моем приложении я добавил перехватчик для фильтрации запроса. Здесь каждый пользователь связан со списком меню. Поэтому, если пользователь попытается получить доступ к странице, которая не связана с ним, мы перенаправим его на страницу unauthorizedUser.jsp, в противном случае мы предоставим пользователю доступ к странице.

Вот мой код перехватчика ...

 @Override
    public  String intercept(ActionInvocation actionInvocation) throws Exception {
        String returnAction = "unauth.user";
        Map<String, String> keyValMap = FCCommonUtils.getALLMenuIdMap();
        ActionContext context = actionInvocation.getInvocationContext();

        HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
        HttpSession session = null;
        if (request != null) {
            session = request.getSession(false);
            String contextPath = request.getContextPath();
            contextPath = contextPath + RequestURIDtls.SEPERATOR;
            String reqURI = request.getRequestURI().substring(contextPath.length(), request.getRequestURI().length());
            String requestedRole = keyValMap.get(reqURI);

            if (requestedRole != null && session != null) {
                UserInfoUIForm userForm = (UserInfoUIForm) session.getAttribute(WebConstants.USER_INFO);
                if (userForm != null) {
                    List<Long> userRoleLst = FCCommonUtils.getmenuids(userForm.getRoleId());

                    if (userRoleLst.contains(new Long(requestedRole))) {
                        //TODO : GUNJAN : NEED TO DO R&D WHY actionInvocation.invoke() CREATES NULL POINTER EXCEPTION
                        //returnAction=actionInvocation.invoke();                        
                        returnAction = "success";
                    } else {
                        returnAction = "unauth.user";
                    }
                } else {
                    returnAction = "unauth.user";
                }
            } else {
                returnAction = "unauth.user";
            }

        } else {
            returnAction = "unauth.user";
        }
        return returnAction;
    }

В приведенном выше коде returnAction = actionInvocation.invoke () выдает исключение нулевого указателя.

Вот моя конфигурация struts.xml для доступа к странице.

<action name="viewCorporate" class="com.ndil.web.corporate.MstCorporateAction" method="viewCorporatePage">
            <interceptor-ref name="menuFilterInterceptor" />
            <result name="unauth.user">/jsp/unAuthUser.jsp</result>
            <result name="success">/jsp/mngCorporate.jsp</result>
        </action>         

Может кто-нибудь подсказать мне, почему actionInvocation.invoke () дает исключение нулевого указателя ???

Спасибо, Гунджан Шах.

Ответы [ 2 ]

4 голосов
/ 03 февраля 2012

Бесплатный обзор кода.

1) Результат перехвата объявлен как переменная, не используется.

2) В любом случае указанное значение должно быть постоянным.

3) Переменная названа неправильно - это не имя действия, это имя результата.

4) Если вы находитесь в перехватчике, вы получили запрос - просто невозможно, чтобы это значение было нулевым. Если равно ноль, произошло нечто гораздо более серьезное, чем неавторизованный пользователь, и мир должен взорваться.

5) Аналогичным образом, если вы специально не настроили все приложение, чтобы оно не создавало сеансы, проверка на сеанс является излишней. Если нет, то что-то пошло не так. Проверьте наличие известных атрибутов сеанса, чтобы определить, вошел ли пользователь в систему, а не на наличие самого сеанса - гораздо проще.

IMO и 4 и 5 , если обрабатываются вообще, должны обрабатываться с декларативными исключениями. В этом состоянии веб-приложение, скорее всего, не работает - подключите пользователя к HTTP 500 или аналогичному.

6) Вложенные условия way слишком глубоки. Строгое следование принципу «один возврат на метод» создает сложный для понимания код, особенно когда метод имеет глубоко вложенные условные выражения.

7) Это выглядит , как будто вы полагаетесь на данные формы для определения роли пользователя. Это по сути небезопасно; Информация о роли пользователя должна храниться в сеансе, где ее нелегко манипулировать.

8) Некоторые различные хитрости оставляют нас с этим:

public class FooInterceptor {

    private static final String UNAUTHORIZED_USER = "unauth.user";

    public  String intercept(ActionInvocation actionInvocation) throws Exception {
        ActionContext context = actionInvocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST);
        if (request == null) {
            return UNAUTHORIZED_USER;
        }

        HttpSession session = request.getSession(false);
        if (session == null) {
            return UNAUTHORIZED_USER;
        }

        Long requestedRole = getRequestedRole(request);
        if (requestedRole == null) {
            return UNAUTHORIZED_USER;
        }

        UserInfoUIForm userForm = (UserInfoUIForm) session.getAttribute(WebConstants.USER_INFO);
        if (userForm == null) {
            return UNAUTHORIZED_USER;
        }

        List<Long> userRoles = FCCommonUtils.getmenuids(userForm.getRoleId());
        return userRoles.contains(requestedRole) ? ActionSupport.SUCCESS : UNAUTHORIZED_USER;
    }

    private Long getRequestedRole(HttpServletRequest request) {
        String contextPath = request.getContextPath() + RequestURIDtls.SEPARATOR;
        String reqURI = request.getRequestURI().substring(contextPath.length(), request.getRequestURI().length());
        try {
            return Long.valueOf(FCCommonUtils.getALLMenuIdMap().get(reqURI));
        } catch (NumberFormatException e) {
            return null;
        }
    }
}

Хотя тестирование метода остается относительно сложным, гораздо проще понять точные потребности тестирования. Это легче читать, потому что вам больше не нужно задумываться "а что, если все наоборот?" как в глубоко вложенном коде.

1 голос
/ 03 февраля 2012

Используйте это:

<action name="viewCorporate" class="com.ndil.web.corporate.MstCorporateAction" method="viewCorporatePage">
        <interceptor-ref name="defaultStack"></interceptor-ref>
        <interceptor-ref name="menuFilterInterceptor" />
        <result name="unauth.user">/jsp/unAuthUser.jsp</result>
        <result name="success">/jsp/mngCorporate.jsp</result>
    </action>    

Struts не добавит этот перехватчик по умолчанию автоматически, когда вы явно указываете перехватчик для объявления действия.

...