zoukankan      html  css  js  c++  java
  • Spring MVC 碰到的实际异常处理

    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class OrderAspact {
        
        @Before("execution(* ocj.com.cn.order.service.impl.TestServiceImpl.*(..))")
        public void processBefore(JoinPoint jp){
            //获取方法名
            System.out.println(jp.getSignature().getName());
            //获取参数
            Object[] args = jp.getArgs();
            for(Object a : args){
                System.out.println(a.toString());
            }
            System.out.println("In Aspact");
        }
        
    }
     
    import javax.servlet.http.HttpServletRequest;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Service;
    
    
    @Aspect 
    @Service
    public class WrongUrlAdvise{
            @Before("execution(* org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler.handleRequest(..)) and args(request,..)")  
            private void addTag(HttpServletRequest request){
                    request.setAttribute(Constants.INVALID_URL, 1);
            }
    }
      

    第一个是参考,

    第二个 使用场景:

    1,web框架:spring mvc

    2,缓存:ehcache 并且使用的是web page cache, dispatch包含了forward

    3,没有使用mvc:resource 给所有静态资源加前缀

    4,缓存拦截到request后发现能命中缓存,于是打上visitLog标记并进行build,但是当前无对应的element,于是FilterChain继续走下去直到Controller,然而spring mvc 找不到映射request请求的url或者发生RunTimeException时Spring MVC会forward给容器的Default Servlet去处理, 根据web.xml 会跳转到相应404页面,然而404也符合缓存的pattern于是也被

    ehcache的filter捕获, 至此发生重入异常

    处理方法

    1, 使用aop在DefaultServletHttpRequestHandler forward 之后直接跳转到处理404的controller,可以解决重入但是所有本地静态资源的请求也会被拒绝

    2,加参,在发生重入的地方进行判断,直接跳过ehcache的dofilter, 但是之后所有forward到404页面的都会走controller

    3,catch到FilterNonReentrantException这个异常,然后redirect到404.

    String uri = request.getServletPath();
    try {
      // Only cache pages matching specific pattern.
       if (!pattern.matcher(uri).matches() || request.getAttribute(Constants.INVALID_URL) != null) {
         chain.doFilter(request, response);
          return;
       }
    。。。。。
      。。。。
      super
    .doFilter(request, response, chain); } catch(FilterNonReentrantException ree){   log.error(this .cacheName + " occured reenter error, request is " + request.getAttribute(Constants.SERVLET_FORWARD_REQUEST_URI));   response.sendRedirect(Constants.ERRORPAGE404); } catch (IOException ioe) {   suppressNetworkException(ioe, uri); } catch (Exception ex) {   log.error(ex);   throw ex; }
    。。。

    参考: DefaultServletHttpRequestHandler.java

  • 相关阅读:
    C#制作windows屏保实战
    创建一个可以修改不可以删除的文件夹或文件,windows目录和文件权限实测总结
    分享一下我用C#写的贪吃蛇和迷宫
    用C#做的汉诺塔游戏以及对汉诺塔递归的简单理解
    纪念一下即将逝去的flash,曾今的flash入门学习示例《别盯着我》C#版
    C#中关于变量的作用域不易理解的特例
    列出文件夹和遍历文件夹的区别
    怎样创建无法直接删除的文件夹--关于windows权限的迷思
    用C#写的后台整点报时工具
    用C#写差异文件备份工具
  • 原文地址:https://www.cnblogs.com/youneverdie/p/3467511.html
Copyright © 2011-2022 走看看