• 拦截器springmvc防止表单重复提交【3】3秒后自动跳回首页【重点明白如何跳转到各自需要的页面没有实现 但是有思路】


    【1】定义异常类

    【重点】:异常类有个多参数的构造函数public CmsException(String s, String... args),可以用来接受多个参数:如(“异常信息”,“几秒跳转”,“跳转url”)

     1 package com.jspxcms.core.support;
     2 
     3 /**
     4  * CmsException CMS异常
     5  * 
     6  * @author liufang
     7  * 
     8  */
     9 public class CmsException extends RuntimeException {
    10     private static final long serialVersionUID = 1L;
    11     private String[] args;
    12 
    13     public CmsException() {
    14         super();
    15     }
    16 
    17     public CmsException(String s) {
    18         super(s);
    19     }
    20 
    21     public CmsException(String s, String... args) {
    22         super(s);
    23         this.args = args;
    24     }
    25 
    26     public CmsException(String message, Throwable cause) {
    27         super(message, cause);
    28     }
    29 
    30     public CmsException(Throwable cause) {
    31         super(cause);
    32     }
    33 
    34     public String[] getArgs() {
    35         return args;
    36     }
    37 
    38     public void setArgs(String[] args) {
    39         this.args = args;
    40     }
    41 
    42 }

    【2】web.xml中定义异常提示页面

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
      3     <display-name>jspxcms</display-name>
      4     <context-param>
      5         <param-name>contextConfigLocation</param-name>
      6         <param-value>
      7             /WEB-INF/conf/context-*.xml
      8             /WEB-INF/conf/custom-component.xml
      9             /WEB-INF/conf/core/core-context-dao.xml
     10             /WEB-INF/conf/core/core-context-service.xml
     11             /WEB-INF/conf/core/core-context-directive.xml
     12             /WEB-INF/conf/ext/ext-context-dao.xml
     13             /WEB-INF/conf/ext/ext-context-service.xml
     14             /WEB-INF/conf/ext/ext-context-directive.xml
     15             /WEB-INF/conf/plugin/**/context-*.xml
     16         </param-value>
     17     </context-param>
     18   <!-- 
     19   <filter>
     20     <filter-name>urlRewriteFilter</filter-name>
     21     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
     22     <init-param>
     23       <param-name>statusEnabled</param-name>
     24       <param-value>false</param-value>
     25     </init-param>
     26     <init-param>
     27       <param-name>statusPath</param-name>
     28       <param-value>/status.jspx</param-value>
     29     </init-param>
     30   </filter>
     31    -->
     32     <filter>
     33         <filter-name>timerFilter</filter-name>
     34         <filter-class>com.jspxcms.common.web.TimerFilter</filter-class>
     35     </filter>
     36     <filter>
     37         <filter-name>encodingFilter</filter-name>
     38         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     39         <init-param>
     40             <param-name>encoding</param-name>
     41             <param-value>UTF-8</param-value>
     42         </init-param>
     43         <init-param>
     44             <param-name>forceEncoding</param-name>
     45             <param-value>true</param-value>
     46         </init-param>
     47     </filter>
     48     <filter>
     49         <filter-name>openEntityManagerInViewFilter</filter-name>
     50         <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
     51     </filter>
     52     <filter>
     53         <filter-name>shiroFilter</filter-name>
     54         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
     55         <init-param>
     56             <param-name>targetFilterLifecycle</param-name>
     57             <param-value>true</param-value>
     58         </init-param>
     59     </filter>
     60     <filter>
     61         <filter-name>jspDispatcherFilter</filter-name>
     62         <filter-class>com.jspxcms.common.web.JspDispatcherFilter</filter-class>
     63         <init-param>
     64             <param-name>prefix</param-name>
     65             <param-value>/jsp</param-value>
     66         </init-param>
     67     </filter>
     68     
     69   <!-- 
     70   <filter-mapping>
     71     <filter-name>urlRewriteFilter</filter-name>
     72     <url-pattern>/*</url-pattern>
     73     <dispatcher>REQUEST</dispatcher>
     74   </filter-mapping>
     75      -->
     76     <filter-mapping>
     77         <filter-name>timerFilter</filter-name>
     78         <url-pattern>*.servlet</url-pattern>
     79     </filter-mapping>
     80     <filter-mapping>
     81         <filter-name>timerFilter</filter-name>
     82         <url-pattern>/cmscp/*</url-pattern>
     83     </filter-mapping>
     84     <filter-mapping>
     85         <filter-name>encodingFilter</filter-name>
     86         <url-pattern>/cmscp/*</url-pattern>
     87     </filter-mapping>
     88     <filter-mapping>
     89         <filter-name>openEntityManagerInViewFilter</filter-name>
     90         <url-pattern>/cmscp/*</url-pattern>
     91     </filter-mapping>
     92     <filter-mapping>
     93         <filter-name>shiroFilter</filter-name>
     94         <url-pattern>/cmscp/*</url-pattern>
     95     </filter-mapping>
     96     <filter-mapping>
     97         <filter-name>timerFilter</filter-name>
     98         <url-pattern>*.jspx</url-pattern>
     99     </filter-mapping>
    100     <filter-mapping>
    101         <filter-name>encodingFilter</filter-name>
    102         <url-pattern>*.jspx</url-pattern>
    103     </filter-mapping>
    104     <filter-mapping>
    105         <filter-name>openEntityManagerInViewFilter</filter-name>
    106         <url-pattern>*.jspx</url-pattern>
    107     </filter-mapping>
    108     <filter-mapping>
    109         <filter-name>shiroFilter</filter-name>
    110         <url-pattern>*.jspx</url-pattern>
    111     </filter-mapping>
    112 
    113      <filter-mapping>
    114         <filter-name>shiroFilter</filter-name>
    115         <url-pattern>/</url-pattern>
    116     </filter-mapping>
    117     <filter-mapping>
    118         <filter-name>timerFilter</filter-name>
    119         <url-pattern>/</url-pattern>
    120     </filter-mapping>
    121     <filter-mapping>
    122         <filter-name>encodingFilter</filter-name>
    123         <url-pattern>/</url-pattern>
    124     </filter-mapping>
    125     <filter-mapping>
    126         <filter-name>openEntityManagerInViewFilter</filter-name>
    127         <url-pattern>/</url-pattern>
    128     </filter-mapping>
    129     
    130     <filter-mapping>
    131         <filter-name>timerFilter</filter-name>
    132         <url-pattern>*.jsp</url-pattern>
    133     </filter-mapping>
    134     <filter-mapping>
    135         <filter-name>encodingFilter</filter-name>
    136         <url-pattern>*.jsp</url-pattern>
    137     </filter-mapping>
    138     <filter-mapping>
    139         <filter-name>openEntityManagerInViewFilter</filter-name>
    140         <url-pattern>*.jsp</url-pattern>
    141     </filter-mapping>
    142     <filter-mapping>
    143         <filter-name>jspDispatcherFilter</filter-name>
    144         <url-pattern>*.jsp</url-pattern>
    145     </filter-mapping>
    146     
    147     <listener>
    148         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    149     </listener>
    150     <listener>
    151         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    152     </listener>
    153     <listener>
    154        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    155     </listener>
    156     <servlet>
    157         <servlet-name>background</servlet-name>
    158         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    159         <init-param>
    160             <param-name>contextConfigLocation</param-name>
    161             <param-value>
    162                 /WEB-INF/conf/servlet-back.xml
    163                 /WEB-INF/conf/core/core-controller-back.xml
    164                 /WEB-INF/conf/ext/ext-controller-back.xml
    165                 /WEB-INF/conf/plugin/**/controller-back.xml
    166             </param-value>
    167         </init-param>
    168         <load-on-startup>1</load-on-startup>
    169     </servlet>
    170     <servlet>
    171         <servlet-name>foreground</servlet-name>
    172         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    173         <init-param>
    174             <param-name>contextConfigLocation</param-name>
    175             <param-value>
    176                 /WEB-INF/conf/servlet-fore.xml
    177                 /WEB-INF/conf/core/core-controller-fore.xml
    178                 /WEB-INF/conf/ext/ext-controller-fore.xml
    179                 /WEB-INF/conf/plugin/**/controller-fore.xml
    180             </param-value>
    181         </init-param>
    182         <load-on-startup>1</load-on-startup>
    183     </servlet>
    184     <servlet>
    185         <servlet-name>keepSessionServlet</servlet-name>
    186         <servlet-class>com.jspxcms.common.web.KeepSessionServlet</servlet-class>
    187     </servlet>
    188     <servlet>
    189         <servlet-name>captchaServlet</servlet-name>
    190         <servlet-class>com.jspxcms.common.captcha.CaptchaServlet</servlet-class>
    191     </servlet>
    192     
    193   <servlet-mapping>
    194         <servlet-name>background</servlet-name>
    195         <url-pattern>/cmscp/*</url-pattern>
    196     </servlet-mapping>
    197     <servlet-mapping>
    198         <servlet-name>foreground</servlet-name>
    199         <url-pattern>*.jspx</url-pattern>
    200     </servlet-mapping>
    201     <servlet-mapping>
    202         <servlet-name>keepSessionServlet</servlet-name>
    203         <url-pattern>/keep_session.servlet</url-pattern>
    204     </servlet-mapping>
    205     <servlet-mapping>
    206         <servlet-name>captchaServlet</servlet-name>
    207         <url-pattern>/captcha.servlet</url-pattern>
    208     </servlet-mapping>
    209     
    210     <session-config>
    211         <session-timeout>20</session-timeout>
    212     </session-config>
    213     
    214     <error-page>
    215         <error-code>400</error-code>
    216         <location>/errors/400.jsp</location>
    217     </error-page>
    218     <error-page>
    219         <error-code>403</error-code>
    220         <location>/errors/403.jsp</location>
    221     </error-page>
    222     <error-page>
    223         <error-code>404</error-code>
    224         <location>/errors/404.jsp</location>
    225     </error-page>    
    226     <error-page>
    227         <error-code>500</error-code>
    228         <location>/errors/500.jsp</location>
    229     </error-page>
    230     <error-page>
    231         <exception-type>javax.validation.ConstraintViolationException</exception-type>
    232         <location>/errors/400.jsp</location>
    233     </error-page>
    234     <!-- shiro中没有权限是抛出异常 -->
    235     <error-page>
    236         <exception-type>org.apache.shiro.authz.AuthorizationException</exception-type>
    237         <location>/errors/403.jsp</location>
    238     </error-page>
    239     <error-page>
    240         <exception-type>org.springframework.dao.DataIntegrityViolationException</exception-type>
    241         <location>/errors/data_integrity_violation_exception.jsp</location>
    242     </error-page>
    243     <error-page>
    244         <exception-type>com.jspxcms.core.support.DeleteException</exception-type>
    245         <location>/errors/delete_exception.jsp</location>
    246     </error-page>
    247     <error-page>
    248         <exception-type>com.jspxcms.core.support.CmsException</exception-type>
    249         <location>/errors/cms_exception.jsp</location>
    250     </error-page>
    251     
    252     <welcome-file-list>
    253         <welcome-file>index.html</welcome-file>
    254         <welcome-file>index.htm</welcome-file>
    255         <welcome-file>index.shtml</welcome-file>
    256         <welcome-file>index.shtm</welcome-file>
    257         <welcome-file>index.jspx</welcome-file>
    258     </welcome-file-list>
    259 </web-app>

    【3】产生异常的地方 此处为拦截器

    【重点】相应的new CmsException("请不要重复提交申请!",“3”,“要分别跳转的url地址”);

     1 package com.jspxcms.ext.interceptor;
     2 
     3 import java.lang.reflect.Method;
     4 import java.util.UUID;
     5 
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 import org.apache.log4j.Logger;
    10 import org.springframework.web.method.HandlerMethod;
    11 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
    12 
    13 import com.jspxcms.core.support.CmsException;
    14 
    15 public class TokenInterceptor extends HandlerInterceptorAdapter {
    16     private static final Logger LOG = Logger.getLogger(TokenInterceptor.class);
    17     
    18     
    19     
    20     @Override
    21     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    22         if (handler instanceof HandlerMethod) {
    23             HandlerMethod handlerMethod = (HandlerMethod) handler;
    24             Method method = handlerMethod.getMethod();
    25             Token  annotation = method.getAnnotation(Token.class);
    26             if (annotation != null) {
    27                 boolean needSaveSession = annotation.save();
    28                 if (needSaveSession) {
    29                     request.getSession(true).setAttribute("token", UUID.randomUUID().toString());
    30                 }
    31                 boolean needRemoveSession = annotation.remove();
    32                 if (needRemoveSession) {
    33                     if (isRepeatSubmit(request)) {
    34                          LOG.warn("please don't repeat submit,url:"+ request.getServletPath());
    35                          throw new CmsException("请不要重复提交申请!");
    36                        // return false;
    37                     }
    38                     request.getSession(true).removeAttribute("token");
    39                 }
    40             }
    41             return true;
    42         } else {
    43             return super.preHandle(request, response, handler);
    44         }
    45     }
    46 
    47     private boolean isRepeatSubmit(HttpServletRequest request) {
    48         String serverToken = (String) request.getSession(true).getAttribute("token");
    49         if (serverToken == null) {
    50             return true;
    51         }
    52         String clinetToken = request.getParameter("token");
    53         if (clinetToken == null) {
    54             return true;
    55         }
    56         if (!serverToken.equals(clinetToken)) {
    57             return true;
    58         }
    59         return false;
    60     }
    61 }

    【4】jsp页面

    【5】页面效果

     【后面补充】:测试的时候发现  href用的是/index.jspx   如果不行  根据时间情况改写

  • 相关阅读:
    docker compose示例
    mysql表分区案例
    mysql表分区实战
    mysql分表
    MongoDB基础教程系列--目录结构
    如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案
    网站性能压力测试工具--apache ab使用详解
    tomcat8 JVM 优化
    tomcat8 性能优化
    redis.properties
  • 原文地址:https://www.cnblogs.com/dixinyunpan/p/5834316.html
Copyright © 2020-2023  润新知