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”指的是一个基于.NET框架的AOP(面向切面编程)库,它采用了MVC ActionFilter的风格。在.NET开发中,AOP是一种编程范式,用于将关注点分离,使得代码更加模块化,易于维护。ActionFilter在ASP...
新建 app\filters\LoggingFilter 继承 yii\base\ActionFilter LoggingFilter 的功能: 在指定请求的 action 前后各记录一条日志 <?php namespace app\filters; use yii\base\ActionFilter; class LoggingFilter ...
### ASP.NET MVC中的Action Filters详解 #### 一、Action Filters简介 Action Filters是ASP.NET MVC框架中的一个核心特性,它们是一类特殊的属性,可以应用于控制器的动作(actions)或整个控制器,用于修改动作...
asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之...
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中,ActionFilter扮演着关键角色,它是一种扩展点,可以用来拦截控制器方法的执行,实现如授权、日志记录等功能。"Token"在这里可能指的是身份验证机制,比如OAuth2或JWT(JSON Web Tokens),用于保护API免...
创建自定义ActionFilter需要继承`System.Web.Mvc.ActionFilterAttribute`,然后覆写其方法,如`OnActionExecuting`(在动作执行前触发)、`OnActionExecuted`(在动作执行后触发)。例如,创建一个简单的日志记录...
在ASP.NET MVC中,事件主要通过ActionFilter、路由事件和生命周期方法等方式进行处理。 **二、ActionFilter** ActionFilter是MVC中的一个关键特性,它允许开发者在Action执行前后执行自定义逻辑。常见的...
下面是一个具体的ActionFilter示例,展示了如何自定义一个ActionFilter来实现特定的功能。 ```csharp public class DemoActionAttributeFilter : ActionFilterAttribute { public string Message { get; set; } ...
2. "YDT.Project.ActionFilter" 这可能是一个示例项目,其中包含了一个名为"ActionFilter"的类,这通常是自定义动作过滤器的实现。动作过滤器在执行控制器的动作方法之前或之后运行,可以用于拦截、修改请求或响应。...
在MVC模式下,可以通过ActionFilter实现静态页面的生成。ActionFilter允许你在执行Action前后进行操作,例如在Action执行后,可以将视图渲染成HTML并保存到硬盘上。此外,ASP.NET MVC提供了一个内置的OutputCache...
3. **自定义ActionFilter**: - Asp.Net MVC允许开发人员创建自定义的ActionFilter,用于拦截和处理HTTP请求。可以创建一个名为`ImgAccessFilter`的过滤器,检查每个图片请求是否符合防盗链规则。 4. **路由配置**...
在"WebAppLog.zip"中,开发者可能定义了一个自定义的ActionFilter,每当控制器的动作方法执行时,都会记录相关信息,这有助于跟踪用户行为和诊断问题。 然后,面向切面编程(AOP)是一种编程范式,旨在将关注点分离,...
在ASP.NET MVC中,可以创建自定义的ActionFilter,这个类会继承自`System.Web.Mvc.ActionFilterAttribute`。然后在Global.asax.cs文件中的`GlobalFilters`集合中注册这个过滤器,这样它将在所有动作方法执行前后自动...
如果要生成静态文件,需要结合其他方法,如上面提到的中间件或ActionFilter。 5. **第三方库:HtmlRender** HtmlRender是一个用于ASP.NET MVC的开源库,它可以将Razor视图渲染为HTML字符串,然后保存为静态文件。...
在本文中,我们将探讨如何通过ActionFilter实现权限认证的扩展,并结合数据库设计来理解整个权限控制系统的工作原理。 首先,我们来看数据库的设计。权限控制通常涉及到多个表,以实现精细的权限分配。在本案例中,...
8. **利用ASP.NET MVC的ActionFilter**:通过ActionFilter实现缓存、日志、权限检查等功能,提高代码复用性和性能。 9. **控制应用程序池配置**:调整应用程序池的配置,如工作进程回收、最大请求限制等,以适应...
- **自定义ActionFilter**:创建一个实现了`IActionFilter`接口的类,重写`OnActionExecuting`和`OnActionExecuted`方法,分别在Action执行前和执行后记录日志信息。 - **使用AOP(面向切面编程)**:通过如Unity...