Если вас беспокоит только CSRF, а не другие проблемы безопасности OWASP, я бы посоветовал вам использовать встроенную поддержку Struts, то есть шаблон токена синхронизатора, вместо использования каких-либо внешних библиотек.
Отрывок о шаблоне синхронизатора из руководства по выживанию Struts.
Чтобы понять, как работает токен синхронизатора, необходимы некоторые сведения о встроенных функциях класса Action. Класс Action имеет метод saveToken(), логика которого следующая:
HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}
Метод генерирует случайный токен, используя идентификатор сеанса, текущее время и MessageDigest, и сохраняет его в сеансе, используя имя ключа org.apache.struts.action.TOKEN (это значение статической переменной TRANSACTION_TOKEN_KEY в org.apache.struts). Класс .Globals. Класс Action, отображающий форму, вызывает метод saveToken() для создания атрибута сеанса с указанным выше именем. В JSP вы должны использовать токен в качестве скрытого поля формы следующим образом:
<input type="hidden"
name="<%=org.apache.struts.taglib.html.Constants.TOKEN_KEY%>"
value="<bean:write name="<%=Globals.TRANSACTION_TOKEN_KEY%>"/>">
Встроенный тег ‹bean:write>, показанный выше, ищет bean-компонент с именем org.apache.struts.action.TOKEN (который является значением Globals. TRANSACTION_TOKEN_KEY ) в области сеанса и отображает его значение как атрибут значения скрытого входная переменная. Имя скрытой входной переменной — org.apache.struts.taglib.html.TOKEN (это не что иное, как значение статической переменной TOKEN_KEY в классе org.apache.struts.taglib.html.Constants). Когда клиент отправляет форму, скрытое поле также отправляется. В действии, обрабатывающем отправку формы (которое, скорее всего, отличается от действия, обрабатывающего форму), токен в отправке формы сравнивается с токеном в сеансе с помощью метода isTokenValid(). Метод сравнивает два токена и возвращает true, если они одинаковы. Обязательно передайте reset="true" в методе isTokenValid(), чтобы удалить токен из сеанса после сравнения. Если два токена равны, форма была отправлена в первый раз. Однако, если два токена не совпадают или в сеансе нет токена, то это дублирующая отправка и обработайте ее способом, приемлемым для ваших пользователей.