Как отобразить удобное сообщение, когда токен недействителен в веб-системе springMVC?

Я использую SpringMVC для разработки своего веб-проекта, и я столкнулся с проблемой повторной отправки формы. Чтобы решить эту проблему, я выполнил поиск в Интернете и использовал для этого перехватчик. Подробная информация приведена ниже:

  • Класс токенов:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {

    boolean save() default false;

    boolean remove() default false;
}

* Класс перехватчика:

public class TokenInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            Token annotation = method.getAnnotation(Token.class);
            if (annotation != null) {
                boolean needSaveSession = annotation.save();
                if (needSaveSession) {
                    request.getSession(false).setAttribute("token", UUID.randomUUID().toString());
                }
                boolean needRemoveSession = annotation.remove();
                if (needRemoveSession) {
                    if (isRepeatSubmit(request)) {
                        return false;
                    }
                    request.getSession(false).removeAttribute("token");
                }
            }
            return true;
        } else {
            return super.preHandle(request, response, handler);
        }
    }

    private boolean isRepeatSubmit(HttpServletRequest request) {
        String serverToken = (String) request.getSession(false).getAttribute("token");
        if (serverToken == null) {
            return true;
        }
        String clinetToken = request.getParameter("token");
        if (clinetToken == null) {
            return true;
        }
        if (!serverToken.equals(clinetToken)) {
            return true;
        }
        return false;
    }
}
  • Блок кода конфигурации XML:
<!-- 拦截器配置 -->
<mvc:interceptors>
    <!-- 配置Shiro拦截器,实现注册用户的注入 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.storezhang.video.shiro.ShiroInterceptor"/>
    </mvc:interceptor>
    <!-- 配置Token拦截器,防止用户重复提交数据 -->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.storezhang.web.spring.TokenInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

Когда я хочу использовать токен для предотвращения повторной отправки формы, мне нужно добавить <input type="hidden" name="token" value="${token}" /> на соответствующую страницу JSP и добавить @Token к соответствующему методу контроллера.

Теперь мой вопрос: используя блоки кода выше, я могу предотвратить повторную отправку формы. Но если токен недействителен preHandle Метод вернет false, и, таким образом, пользователю будет показана пустая страница. Что мне следует сделать, чтобы изменить вышеуказанные блоки кода, чтобы дать пользователю удобное сообщение, когда токен недействителен?

0 ответов

Другие вопросы по тегам