`

ActionFilter

 
阅读更多
package util;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.regex.Pattern;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

public class ActionFilter implements Filter
{
    private ServletContext context;
    static Logger log = Logger.getLogger(ActionFilter.class);

    @Override
    public void init(FilterConfig cfg) throws ServletException
    {
        this.context = cfg.getServletContext();
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
            ServletException
    {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        RequestContext rc = RequestContext.begin(this.context, request, response);
        String url = request.getRequestURI();
        boolean flag = Pattern.compile("(.css|.js|.png|.gif|.jpg|.jpeg|.jsp|.html|.htm)$").matcher(url).find();
        url = url.substring(request.getContextPath().length() + 1);
        try
        {
            if (url.length() == 0 || flag)
            {
                chain.doFilter(RequestContext.getRequest(), RequestContext.getResponse());
                return;
            }
            else
            {
                long t1 = System.currentTimeMillis();
                log.debug("url=" + url);
                boolean ignore = Pattern.compile("(common/vc|common/login|common/logout)$").matcher(url).find();
                if (!ignore)
                {
                    Object user = request.getSession().getAttribute("user");
                    if (user == null)
                    {
                        String xhr = request.getHeader("x-requested-with");
                        if(!StringUtils.isBlank(xhr)){
                            response.setStatus(1111);
                        }else{              
                            response.getWriter().println("abc");
                        }
                        return;
                    }
                }
                String[] parts = StringUtils.split(url, '/');
                if (parts.length < 1)
                {
                    response.sendError(HttpServletResponse.SC_NOT_FOUND);
                    return;
                }
                String action_name = StringUtils.capitalize(parts[0]) + "Action";
                String action_method_name = (parts.length > 1) ? parts[1] : "execute";
                log.debug("action=" + action_name);
                log.debug("method=" + action_method_name);
                Class<?> cls = Class.forName("action." + action_name);
                MethodUtils.invokeMethod(cls.newInstance(), action_method_name, null);
                long t2 = System.currentTimeMillis();
                log.debug("handleTime=" + (t2 - t1) + "ms");
            }
        }
        catch (Exception e)
        {
            log.debug("Exception in action.");
            if (e instanceof ClassNotFoundException)
            {
                log.debug(e.getMessage() + " Not Found.");
            }
            else if (e instanceof NoSuchMethodException)
            {
                log.debug(e.getMessage());
            }
            else if (e instanceof InvocationTargetException)
            {
                Throwable t = e.getCause();
                log.debug(t.getMessage());
                String xhr = request.getHeader("x-requested-with");
                if(!StringUtils.isBlank(xhr)){
                    response.setStatus(9999);
                    response.getWriter().print(t.getMessage());
                }
            }
            else
            {
                throw new ServletException(e);
            }
        }
        finally
        {
            if (rc != null)
            {
                rc.end();
            }
        }
    }

    @Override
    public void destroy()
    {

    }
}

  

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Flatwhite is an AOP library with MVC ActionFilter style using .N

    标题中的“Flatwhite”指的是一个基于.NET框架的AOP(面向切面编程)库,它采用了MVC ActionFilter的风格。在.NET开发中,AOP是一种编程范式,用于将关注点分离,使得代码更加模块化,易于维护。ActionFilter在ASP...

    Yii中特殊行为ActionFilter的使用方法示例

    新建 app\filters\LoggingFilter 继承 yii\base\ActionFilter LoggingFilter 的功能: 在指定请求的 action 前后各记录一条日志 &lt;?php namespace app\filters; use yii\base\ActionFilter; class LoggingFilter ...

    ASPNET_MVC_ActionFilter.pdf

    ### ASP.NET MVC中的Action Filters详解 #### 一、Action Filters简介 Action Filters是ASP.NET MVC框架中的一个核心特性,它们是一类特殊的属性,可以应用于控制器的动作(actions)或整个控制器,用于修改动作...

    asp.net core MVC 过滤器之ActionFilter过滤器(2)

     asp.net core MVC 过滤器之ActionFilter过滤器(二)  asp.net core MVC 过滤器之ResultFilter过滤器(三)  asp.net core MVC 过滤器之ResourceFilter过滤器(四)  asp.net core MVC 过滤器之...

    2021年最新 .NET5从0基础到精通23-34.rar

    023.NET5_Autofac生命周期.mp4 024.NET5_Autofac配置文件.mp4 025.NET5_Autofac整合MVC.mp4 026.NET5_Autofac控制器属性注入.mp4 027.NET5_Autofac单实例多实现.mp4 ...034.NET5_ActionFilter做日志.mp4

    WebApi服務器端代碼

    在WebApi中,ActionFilter扮演着关键角色,它是一种扩展点,可以用来拦截控制器方法的执行,实现如授权、日志记录等功能。"Token"在这里可能指的是身份验证机制,比如OAuth2或JWT(JSON Web Tokens),用于保护API免...

    asp.net mvc2.0 filter

    创建自定义ActionFilter需要继承`System.Web.Mvc.ActionFilterAttribute`,然后覆写其方法,如`OnActionExecuting`(在动作执行前触发)、`OnActionExecuted`(在动作执行后触发)。例如,创建一个简单的日志记录...

    MVC事件机制的底层架构

    在ASP.NET MVC中,事件主要通过ActionFilter、路由事件和生命周期方法等方式进行处理。 **二、ActionFilter** ActionFilter是MVC中的一个关键特性,它允许开发者在Action执行前后执行自定义逻辑。常见的...

    AOP_Filter

    下面是一个具体的ActionFilter示例,展示了如何自定义一个ActionFilter来实现特定的功能。 ```csharp public class DemoActionAttributeFilter : ActionFilterAttribute { public string Message { get; set; } ...

    2021-05-28-WebAPI高级应用三--过滤器Filter.rar

    2. "YDT.Project.ActionFilter" 这可能是一个示例项目,其中包含了一个名为"ActionFilter"的类,这通常是自定义动作过滤器的实现。动作过滤器在执行控制器的动作方法之前或之后运行,可以用于拦截、修改请求或响应。...

    .net 生成静态页

    在MVC模式下,可以通过ActionFilter实现静态页面的生成。ActionFilter允许你在执行Action前后进行操作,例如在Action执行后,可以将视图渲染成HTML并保存到硬盘上。此外,ASP.NET MVC提供了一个内置的OutputCache...

    Asp.Net MVC 图片防盗链(v_1.1.0)

    3. **自定义ActionFilter**: - Asp.Net MVC允许开发人员创建自定义的ActionFilter,用于拦截和处理HTTP请求。可以创建一个名为`ImgAccessFilter`的过滤器,检查每个图片请求是否符合防盗链规则。 4. **路由配置**...

    WebAppLog.zip

    在"WebAppLog.zip"中,开发者可能定义了一个自定义的ActionFilter,每当控制器的动作方法执行时,都会记录相关信息,这有助于跟踪用户行为和诊断问题。 然后,面向切面编程(AOP)是一种编程范式,旨在将关注点分离,...

    MVC 加水印

    在ASP.NET MVC中,可以创建自定义的ActionFilter,这个类会继承自`System.Web.Mvc.ActionFilterAttribute`。然后在Global.asax.cs文件中的`GlobalFilters`集合中注册这个过滤器,这样它将在所有动作方法执行前后自动...

    Asp.net生成静态页面

    如果要生成静态文件,需要结合其他方法,如上面提到的中间件或ActionFilter。 5. **第三方库:HtmlRender** HtmlRender是一个用于ASP.NET MVC的开源库,它可以将Razor视图渲染为HTML字符串,然后保存为静态文件。...

    mvc权限控制案例

    在本文中,我们将探讨如何通过ActionFilter实现权限认证的扩展,并结合数据库设计来理解整个权限控制系统的工作原理。 首先,我们来看数据库的设计。权限控制通常涉及到多个表,以实现精细的权限分配。在本案例中,...

    25SecretsForFasterASP.Net-英文原版.zip

    8. **利用ASP.NET MVC的ActionFilter**:通过ActionFilter实现缓存、日志、权限检查等功能,提高代码复用性和性能。 9. **控制应用程序池配置**:调整应用程序池的配置,如工作进程回收、最大请求限制等,以适应...

    在MVC中记录操作日志类

    - **自定义ActionFilter**:创建一个实现了`IActionFilter`接口的类,重写`OnActionExecuting`和`OnActionExecuted`方法,分别在Action执行前和执行后记录日志信息。 - **使用AOP(面向切面编程)**:通过如Unity...

Global site tag (gtag.js) - Google Analytics