Понимание концепции проверки в Struts 2

Я не понимаю концепцию проверки Struts2 в следующем случае:

Мое приложение состоит из 2 действий:

  1. логин.действие
  2. Драйв.действие

Я могу запустить drive.action из командной строки браузера, не вводя пользователя и пароль в login.action

Как я могу реализовать код проверки, который предотвращает запуск drive.action из командной строки, если пользователь не ввел имя пользователя и пароль в login.action?


person evgenii ershenko    schedule 28.08.2013    source источник
comment
Командная строка? Проверка зависит от перехватчиков.   -  person Dave Newton    schedule 29.08.2013
comment
Вероятно, вы ищете аутентификацию, а не проверку.   -  person Aleksandr M    schedule 29.08.2013
comment
stackoverflow.com/questions/5509606/   -  person Steven Benitez    schedule 30.08.2013


Ответы (2)


Концепция проверки

Проверка Struts 2 настраивается с помощью XML или аннотаций. Ручная проверка в действии также возможна и может сочетаться с проверкой на основе XML и аннотаций.

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

Если мы используем настройки по умолчанию и наше действие не имеет определенного результата ввода, и есть ошибки проверки (или, кстати, преобразования типа), мы получим сообщение об ошибке, сообщающее нам, что для действия не определен результат ввода. действие.


Это просто: вы сопоставляете валидаторы с полями через файл конфигурации проверки или с помощью аннотаций. Затем примените к действию validation перехватчик, ссылаясь на него явно или неявно. через стек перехватчика, пользовательский стек или defaultStack.

При запуске проверки он вызывает диспетчер проверки для выполнения фактической проверки и сохранения ошибок в файле ValidationAware.

Ваше действие должно реализовать этот интерфейс или просто расширить ActionSupport там, где это уже реализовано, чтобы избежать ошибок. Затем workflow interceptor проверяет эти ошибки и, если они обнаружены, они перенаправляют на INPUT результат, если ошибок не обнаружено, выполняется вызов действия. Вы также можете добавить к действию программную проверку, внедрив Validateable, который ActionSupport реализован по умолчанию, поэтому переопределяет validate() методы.

В дополнение к проверке на основе XML вы также можете применить конфигурацию на основе аннотаций. Это только проверка на стороне сервера, проверка на стороне клиента, применяемая к браузеру с включенным javascript через теги Struts, используемые для рендеринга содержимого проверки на проверяемой странице.

Вся эта концепция неприменима к действию, требующему аутентификации (если только к действию не применяется перехватчик аутентификации). Если вы используете аутентификацию JAAS, вам следует рассмотреть возможность реализации PrincipalAware или используйте перехватчик roles, чтобы ограничить доступ к действию, которое проверяет isUserInRole(). Вы можете использовать Action.LOGIN результат для возврата на страницу входа в перехватчик аутентификации, если пользователь не аутентифицирован, как в Есть ли способ перенаправить на другой класс действий без использования примера struts.xml.

person Roman C    schedule 29.08.2013
comment
Если я включу проверку на стороне клиента, будет ли отключена проверка на стороне сервера? @ Roman C - person tanmoy; 10.12.2014
comment
@tanmoy Нет, проверка на стороне сервера работает независимо от проверки на стороне клиента. - person Roman C; 10.12.2014
comment
@ Roman C Так что нам не нужен отдельный код javascript для проверки. Я прав? - person tanmoy; 10.12.2014
comment
Вы можете использовать встроенный код javascript S2 или использовать собственный код, это зависит от требований. - person Roman C; 10.12.2014

Для этого вам нужно использовать перехватчик, как сказал Дэйв Ньютон.
Код перехватчика:

package com.interceptor;
public class SessionInterceptor implements Interceptor,ServletRequestAware,SessionAware
{ 
   HttpServletRequest request; //request object
   public Map<String, Object> sessionMap;

@Override
public void setSession(Map<String, Object> arg0) {
    
    this.sessionMap = arg0;
}

@Override
public void setServletRequest(HttpServletRequest arg0) {
    
    this.request = arg0;
}

@Override
public void destroy() {
    
    
}

@Override
public void init() {
    
    
}

@Override
public String intercept(ActionInvocation invocation) throws Exception {
    
    sessionMap=invocation.getInvocationContext().getSession();
    ActionContext context=(ActionContext)invocation.getInvocationContext();

    String className = invocation.getAction().getClass().getName();
    String ActionName = invocation.getAction().toString();//action name which is called
           
            //below check if session map or username is null or you logic
            if(sessionMap==null || sessionMap.get("userName")==null){
            return "loginError";    //this will return without calling your drive.action if user name or session is null
        }else{
            return invocation.invoke();  //if session is available or user name then it will run the action
        }
  }//end of intercept method
}//end of class

struts.xml:

    <package name="Pkg" extends="struts-default" namespace="/">
    
    <interceptors>
        <interceptor name="sessionCheck" class="com.interceptor.SessionInterceptor">
    </interceptor>
    <interceptor-stack name="sessionStack">
        <interceptor-ref name="sessionCheck"/>          
        <interceptor-ref name="defaultStack" />
    </interceptor-stack>
    </interceptors>
    
    <default-interceptor-ref name="sessionStack"></default-interceptor-ref>
    
    <global-results>
        <result name="loginError">login.jsp</result>
    </global-results>
           //here all the actions which you want to apply interceptor
         //rest of actions where above SessionInterceptor will be applied
        ...
        ....
        .....

Не пишите сначала login.action внутри пакета выше, вместо этого создайте новый пакет в struts.xml, например:

   <package name="Pkg2" extends="struts-default">       
    <action name="login.action" class="com.action.LogAction" method="execute">
        <result name="success" type="redirect">drive</result> <!-- here action name drive is action from above package where interceptor is applied or any which you want-->
    </action>
  </package>

Надеюсь, это то, что вы ищете.
Вот несколько ссылок, которые могут вам помочь

  1. перехватчик сеанса
  2. конфигурация пакета
  3. перехватчик
  4. пример стека перехватчика
person Aniket Kulkarni    schedule 29.08.2013
comment
Ваш перехватчик не сработает. Интерфейсы SessionAware и ServletRequestAware помечают действия для внедрения, а не другие перехватчики. Пересмотрите его, чтобы вывести сеанс и запрос из контекста вызова. - person Steven Benitez; 30.08.2013
comment
@StevenBenitez: Сэр, приведенный выше код у меня работает. Если есть ошибки, то исправьте пожалуйста. - person Aniket Kulkarni; 30.08.2013
comment
Я не уверен, как это будет работать. Что вводит карту сеанса и HttpServletRequest? Обычно ServletConfigInterceptor внедряет их в actions. Перехватчики не перехватывают другие перехватчики, так что опять же, не знаю, как это работает. - person Steven Benitez; 30.08.2013