Запретить пользователю напрямую обращаться к действию Struts2?

#java #model-view-controller #struts2

#java #модель-представление-контроллер #struts2

Вопрос:

У меня есть следующие действия, определенные в моем struts.xml

     <action name="Search" method="prepareLookUpvalues" class="com.mycompany.actions.FrSearchAction">
        <result name="success" type="tiles">search.layout</result>
    </action>

    <action name="List" class="com.mycompany.actions.FrSearchAction">
        <result name="success" type="tiles">results.layout</result>
        <result name="input" type="tiles">search.layout</result>
    </action>

    <action name="SearchDetails" class="com.mycompany.actions.FrSearchDetailsAction">
        <result name="success" type="tiles">details.layout</result>
    </action>

    <action name="Logoff" class="com.mycompany.actions.LogoffAction" >
        <result name="success" type="tiles">logoff.layout</result>
    </action>
  

Предполагая, что пользователь переходит непосредственно на мою домашнюю страницу http://localhost:8080/fr/Search.action все работает нормально, но было обнаружено, что некоторые пользователи обращаются http://localhost:8080/fr/List.action напрямую, без предварительного перехода на страницу поиска, что вызывает проблемы.

Когда пользователь переходит на страницу поиска, вводит критерии и отправляет, только тогда действие «Список» должно вызываться через атрибут action формы struts. По сути, я хочу запретить пользователям напрямую обращаться к действиям «Список», «Поисковые данные» и «Выход из системы», если только эти действия не вызываются из моего JSP или кода.

Я новичок в обслуживании / разработке приложений Struts2, и я не нашел четких ответов на этот вопрос. Любые предложения будут высоко оценены!

Ответ №1:

Не хватает нескольких деталей, поэтому ответ будет немного расплывчатым, но действие list, вероятно, извлекает значения из формы отправки для поиска? Или извлекает состояние из сеанса? Или …?

В любом случае, как бы это ни было сохранено, просто проверьте, а затем перенаправьте пользователя на поиск, если состояние установлено не так, как ожидалось.

Подробнее о выполнении перенаправлений в struts2 см., например http://www.roseindia.net/struts/struts2/actions/struts-2-redirect-action .shtml

Ответ №2:

Это не элегантное решение, но вы могли бы попробовать проверить referer , чтобы увидеть, кто вызвал действие. Вам нужно будет реализовать класс action ServletRequestAware .

 String referrer = request.getHeader("referer");
if (referrer.equals("http://localhost:8080/fr/Search.action")) {
// do the action
} else {
// handle unwanted access 
}
  

Помните, что referer — это значение, контролируемое клиентом, и его можно подделать или удалить.