`
hhywangwei
  • 浏览: 6397 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

使用过滤器,处理404错误获得指定资源。

阅读更多
在项目中我遇到读取资源问题,资源路径没有规则,还有很多虚拟路径处理。我使用了Filter过滤404错误方法处理这些资源。在实现过程中统一了资源处理方法,并且容易同spring的整合。该实现在Tomcat 6.0上测试通过。

实现需要注意二点:
  • 1.使用HttpServletResponseWrapper包装response
  • 2.覆盖sendError方法,遇到404错误不能触发错,如触发错误response就被托管,托管后就不能输出数据。

下面是HttpServletResponseWrapper具体实现:
  private class Error404ResponseWrapper extends HttpServletResponseWrapper {
        
        private int status = SC_OK;
        
        public Error404ResponseWrapper(Error404Filter error404Filter, HttpServletResponse response){
            super(response);
        }
        
        @Override
        public void sendError(int sc) throws IOException {
            this.status = sc;
            if(isFound()){
                super.sendError(sc);                
            }else{
                super.setStatus(SC_OK);
            }
        }

        @Override
        public void sendError(int sc, String msg) throws IOException {
            this.status = sc;
            if(isFound()){
                super.sendError(sc,msg);  
            }else{
                super.setStatus(SC_OK);                 
            }
        }
        
        public void setStatus(int status){
           this.status = status;
           super.setStatus(status);
        }
        
        @Override
        public void reset() {
            this.status = SC_OK;
            super.reset();
        }

        
        public boolean isFound(){
            return status != SC_NOT_FOUND;
        }
    }

注意sendError处理,上面代码解决了核心两个问题。接下来完成过滤就可。
public class Error404Filter implements Filter {
  @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
    }
    
    @Override
    public void doFilter(ServletRequest req, ServletResponse rep,FilterChain chain) throws IOException, ServletException {
        
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) rep;
        Error404ResponseWrapper responseWrapper = new Error404ResponseWrapper(this, response);
        
        chain.doFilter(request, responseWrapper);
        if(responseWrapper.isFound()){
            return ;
        }
        
        //TODO 实现读取资源
        //readResource(request,response);
        
        //资源不存在返回错误
        String uri = request.getRequestURI();
        logger.warn("This is not resource = {}",uri);
        response.sendError(HttpServletResponse.SC_NOT_FOUND,uri);
    }
}

注意:在web.xml中把该过滤器放在所有过滤器后。
分享到:
评论

相关推荐

    servlet过滤器实例经典过滤器

    过滤器可以检查用户的角色,如果用户不具备访问某个资源的权限,返回错误信息或重定向到无权限页面。 5. **GZIP压缩过滤器**:提高网站性能,通过压缩HTTP响应内容减少传输的数据量。过滤器可以检测客户端是否接受...

    过滤器处理中文

    4. 错误处理:如果在处理过程中发生`ServletException`或`IOException`,过滤器会记录这些异常信息。 5. 销毁方法(`destroy()`):当过滤器不再使用,即将被卸载时,会调用此方法。在这里,我们简单地清空了资源,...

    使用过滤器实现判断用户是否登录验证.

    3. **配置过滤器**:在项目的web.xml文件中,我们需要定义这个过滤器,并指定哪些URL需要被过滤。例如,我们可能希望保护所有需要登录才能访问的页面。 ```xml <filter-name>LoginFilter <filter-class>...

    过滤器进行登录操作

    在Java Web开发中,过滤器(Filter)是一个强大的工具,常用于实现各种需求,如登录操作的处理。本文将深入探讨如何使用过滤器进行登录操作,以及这一过程中的相关知识点。 首先,我们要理解过滤器的基本概念。在...

    servlet过滤器验证用户登录

    2. **映射过滤器**:紧接着使用`<filter-mapping>`元素,关联之前定义的过滤器名称,并通过`<url-pattern>`指定过滤器的作用范围。例如,可以配置过滤器仅对某个JSP页面(如`/a.jsp`)或整个目录(如`/a/*`)生效。 ...

    struts2完全捕获404错误的方法

    另一种方法是在Web应用的`web.xml`配置文件中,使用Servlet过滤器来捕获404错误。当请求没有匹配到任何Struts2动作时,过滤器可以捕获这个情况并重定向到404错误页面。 ```xml <filter-name>catch404Filter ...

    过滤器操作数据库验证合法用户

    5. **配置过滤器**:在`web.xml`部署描述符或使用Servlet 3.0以上的注解`@WebFilter`,我们可以指定过滤器的URL模式,决定哪些请求需要通过这个过滤器。例如,将过滤器应用于所有`.jsp`页面或特定的Servlet。 6. **...

    包含过滤器的一个简单登陆实例

    2. **配置过滤器**:在Web应用的`web.xml`配置文件中,我们需要声明并配置过滤器,指定其过滤哪些URL,以及过滤器的顺序。在这个实例中,可能我们会设置过滤器拦截所有需要登录的页面。 3. **过滤器链**:多个过滤...

    servlet过滤器实例代码

    在这个实例代码中,我们将深入探讨Servlet过滤器的使用,以及如何通过它来增强应用程序的功能。 首先,我们需要了解Servlet过滤器的基本原理。在`web.xml`部署描述符中,我们可以通过`<filter>`和`<filter-mapping>...

    权限管理(过滤器粗粒度无侵入拦截方式)

    在Java Web开发中,过滤器是Servlet规范的一部分,它允许开发者在请求到达目标资源(如Servlet、JSP等)之前和之后对请求和响应进行拦截处理。通过实现`javax.servlet.Filter`接口并配置在web.xml或使用注解,我们...

    ssm框架的登录过滤器

    SSM框架,全称Spring、...总的来说,SSM框架的登录过滤器是系统安全的重要组成部分,通过对请求的拦截和处理,确保只有合法用户才能访问受保护的资源。通过合理的设计和实现,我们可以构建出高效、安全的Web应用。

    过滤器--控制不同权限用户访问不同文件夹代码.rar

    总结来说,"过滤器--控制不同权限用户访问不同文件夹代码.rar"是一个实用的示例,它展示了如何使用Java Servlet过滤器技术实现精细的权限控制,确保不同权限级别的用户只能访问其被授权的资源。这样的功能对于保护...

    java web权限访问过滤器

    过滤器是Servlet API的一部分,它允许我们在请求到达目标资源(如Servlet、JSP页面)之前或之后对请求和响应进行拦截处理。 首先,我们需要了解过滤器的基本概念。在Java Web中,过滤器是一个实现了javax.servlet....

    过滤器应用案例

    2. **配置过滤器**:在web.xml文件中,我们需定义过滤器并映射它,指定哪些URL需要经过这个过滤器。在本例中,我们将过滤所有/admin路径下的请求。 ```xml <filter-name>LoginFilter <filter-class>...

    文件服务器访问虚拟路径过滤器源代码

    2. **Filter配置**:在`web.xml`配置文件中,我们需要指定过滤器的类名、URL模式以及其在请求处理链中的顺序。这决定了哪些请求会被过滤,以及过滤器的执行顺序。 3. **路径匹配**:过滤器可能需要检查请求的URL...

    SSM登陆验证之过滤器实现

    SSM(Spring、SpringMVC、MyBatis)框架是Java Web开发中常见的技术栈,其在处理用户请求时,通常会用到过滤器(Filter)进行预处理,以实现如登录验证等功能。本篇文章将深入讲解如何在SSM项目中通过过滤器实现登录...

    通过过滤器管理用户权限(2)

    - `@Order`注解:Spring Boot允许使用该注解来指定过滤器的执行顺序。顺序越小,过滤器越早执行。 - `FilterRegistrationBean`:在Spring Boot中,可以使用此Bean来更灵活地配置Filter,包括设置URL匹配模式、初始...

    利用过滤器解决JavaWeb(JSP)乱码问题

    **过滤器机制**是Servlet技术提供的一个强大功能,它可以在请求到达目标资源(如Servlet或JSP页面)之前对请求进行预处理,并在响应返回客户端之前对其进行后处理。通过合理地设计过滤器,可以有效地解决乱码问题。 ...

    利用过滤器设置权限利用过滤器设置权限

    **过滤器(Filter)** 是Servlet容器提供的一个接口,它可以在请求达到目标资源(如Servlet或JSP页面)之前进行预处理,也可以在响应返回客户端之前进行后处理。在Java Web开发中,过滤器经常被用来实现诸如权限验证...

    jsp 权限过滤器的应用

    3. **Filter配置**:文章会讨论如何在`web.xml`或使用Java Configuration(如Spring框架)来配置过滤器,指定哪些URL路径需要被过滤,以及过滤器的执行顺序。 4. **权限检查逻辑**:接着,它可能详细阐述过滤器的`...

Global site tag (gtag.js) - Google Analytics