`
cuisuqiang
  • 浏览: 3960695 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3670430
社区版块
存档分类
最新评论

关于Filter中的两个异常,重定向后要加Return

    博客分类:
  • J2EE
阅读更多

这是个很常见的问题,度娘和谷歌动手就能查到,可是今天还是遇到了,因为一直做业务研发,没有直接关注这些细节。

该文章来自ITeye,网络爬虫请自重!欢迎大家访问我的博客

这两个异常如下:

java.lang.IllegalStateException: Cannot forward after response has been committed
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:313)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
	at com.servlet.MyServlet2.doGet(MyServlet2.java:22)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.filter.MyFilter.doFilter(MyFilter.java:48)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
	at java.lang.Thread.run(Unknown Source)

 

java.lang.IllegalStateException
	at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
	at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:662)
	at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:325)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.filter.MyFilter.doFilter(MyFilter.java:48)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
	at java.lang.Thread.run(Unknown Source)

 

只要在重定向后加return就可以了。

public void doFilter(ServletRequest request, ServletResponse response,
		FilterChain chain) throws IOException, ServletException {
	request.setCharacterEncoding("UTF-8");
	response.setCharacterEncoding("UTF-8");		
	HttpServletRequest hrequest = (HttpServletRequest)request;
	String path = hrequest.getContextPath();
	String basePath = hrequest.getScheme()+"://"+hrequest.getServerName()+":"+hrequest.getServerPort()+path+"/";
	// 获得请求的全路径
	String reUrl = hrequest.getRequestURL().toString();
	// 是否包含参数
	int index = reUrl.indexOf("?");
	String re = "";
	if(index == -1){
		re = reUrl.substring(basePath.length());
	}else{
		re = reUrl.substring(basePath.length(), index);
	}
	// 是否是请求资源
	if(!isResource(re)){
		// 是否有访问的权限
		boolean isCheck = ConnUril.checkUrl(re);
		if(!isCheck){
			request.getRequestDispatcher("/error.jsp").forward(request,response);
			// 必须加返回,否则报错
			return ;
		}
	}
	// 继续执行
	chain.doFilter(request, response);
}

 

报错原因很简单,转向后再去执行关于response的操作,就等于执行了两遍转向,因此会报错!

 

问题简单,也需要留意,再简单的问题也是问题,成功在细节和那些别人以为是傻冒的问题中。

 

请您到ITEYE看我的原创:http://cuisuqiang.iteye.com

或支持我的个人博客,地址:http://www.javacui.com

 

2
1
分享到:
评论
2 楼 sp42 2015-08-09  
学习了 谢谢哦
1 楼 枫桥夜泊城 2013-09-10  
重定向需要增加return语句,
我看到有些chain.dofilter(req,resp)后也添加return语句,

相关推荐

    javaWeb项目 filter练习

    本项目"javaWeb项目 filter练习"主要关注了两个核心的应用场景:编码过滤和登录过滤。下面将详细介绍这两个方面的内容。 **编码过滤** 在Web应用中,数据从客户端传输到服务器时,可能会遇到编码不一致的问题,导致...

    servlet之Filter使用范例--登陆验证

    在Java Web开发中,Servlet和Filter是两个非常重要的概念。Servlet是Java提供的一个用于扩展服务器功能的接口,而Filter则是一种动态web资源过滤机制,它允许我们在数据处理流程中进行预处理和后处理,比如登录验证...

    SpringBoot的Filter过滤器

    在IntelliJ IDEA(简称Idea)这个强大的Java开发工具中,我们可以创建一个新的Java类,并让它继承自`javax.servlet.Filter`接口。这个接口定义了三个方法:`doFilter()`, `init()`, 和 `destroy()`。其中,`doFilter...

    java中filter的用法.pdf

    下面将详细讨论Java中Filter的使用方法,包括如何创建和配置过滤器,以及上述示例中的两个具体应用场景。 1. **防止浏览器缓存页面的过滤器**: 防止浏览器缓存页面是确保每次请求都能获取最新内容的重要步骤。在...

    拦截器 FILTER 样例

    2. **映射路径**:接着,通过两个`filter-mapping`元素配置了该拦截器的作用范围。第一个映射表示所有`.jsp`后缀的页面都将经过此拦截器;第二个映射则针对所有`.do`后缀的请求进行过滤。 #### 四、工作流程 1. **...

    你真的了解Filter过滤器 ?

    在Java Web开发中,Filter过滤器是一个至关重要的概念,它属于JavaWeb的三大核心组件之一,另外两个是Servlet程序和Listener监听器。Filter的主要职责在于对HTTP请求进行预处理以及对响应进行后处理,而并非直接生成...

    filter的使用 java 过滤器的几种使用方法

    过滤器的使用并不局限于上述两个示例。在实际应用中,过滤器可以用于执行各种任务,如日志记录、压缩响应、转换编码等。要使用过滤器,需要在Web应用的部署描述符(`web.xml`)中进行配置。例如: ```xml <filter> ...

    servlet与filter实现登录认证

    在Java Web开发中,Servlet和Filter是两种非常重要的组件,它们在构建动态Web应用程序时起着关键作用。本文将详细探讨如何使用Servlet和Filter来实现用户登录认证。 Servlet是一种Java编程语言编写的服务器端程序,...

    Springboot中使用过滤器映射访问路径

    // 如果不满足重定向条件,继续执行链路中的下一个过滤器 return chain.filter(exchange); } } ``` 2. **使用`FilterRegistrationBean`:** 对于非反应式编程或者兼容旧版本Spring Boot的情况,我们可以使用`...

    SpringMVC核心技术精讲.docx

    在Spring MVC中,请求转发和重定向是两种常见的页面跳转方式,它们在处理完控制器方法后用于将用户导向不同的资源。这两种跳转方式在实际应用中有着不同的使用场景和特性。 1. 请求转发(Request Forwarding) ...

    第二课:通过MVC原理,自定义MVC框架实现1

    这两个组件允许我们自定义异常处理和请求拦截。 1. HandlerExceptionResolver 异常处理 HandlerExceptionResolver接口用于处理在处理请求过程中发生的异常。当在DispatcherServlet中遇到异常时,它会调用`...

    在使用实现过滤器进行request包装,获取内层request的分析

    `filter`和`manager`这两个文件名可能代表了过滤器相关的其他内容,但没有具体的文件内容,无法给出详细的解释。通常,`filter`可能是对过滤器功能的进一步封装或抽象,而`manager`可能是一个管理多个过滤器的类,...

    JavaWeb Servlet中Filter过滤器的详解

    Filter的配置包括两个主要部分: - 编码实现:通过继承Filter接口并复写doFilter()方法来定义过滤器的具体行为。doFilter()方法中,可以对请求和响应进行处理。 - web.xml的配置:在web.xml文件中配置Filter,指定...

    Spring MVC面试题(2022最新版)

    这两个对象都实现了`ModelMap`接口,可以在控制器方法中通过参数注入。 ```java public String handleRequest(Model model) throws Exception { model.addAttribute("message", "Hello, World!"); return "view...

    【ASP.NET编程知识】Asp.net mvc 权限过滤和单点登录(禁止重复登录).docx

    ASP.NET MVC权限过滤和单点登录...权限控制和单点登录是ASP.NET MVC应用程序中的两个重要概念,通过使用AuthorizeAttribute和FormAuthentication等技术,可以实现权限控制和单点登录,提高应用程序的安全性和可靠性。

    四个有用的Java过滤器收藏

    这两个Java过滤器示例展示了如何利用Servlet过滤器机制来增强Web应用程序的功能性和安全性。`ForceNoCacheFilter`通过控制缓存策略,确保了动态内容的即时性;而`CheckLoginFilter`则通过会话管理,保障了用户数据的...

    dofilter过滤器

    ### doFilter过滤器详解 #### 引言 在Java Web开发中,`doFilter`方法是Servlet过滤...上述两个示例只是过滤器众多应用场景中的冰山一角,理解并熟练掌握过滤器的使用,对于提高Web应用的安全性和性能具有重要意义。

    Java几个过滤器学习技巧

    在Java Web开发中,过滤器(Filter)是一种非常实用的功能组件,它可以对用户的请求或响应进行预处理或后处理。通过实现`javax.servlet.Filter`接口,开发者可以自定义过滤器来执行特定的操作。本文将详细介绍两个...

    springmvc 使用hibernate-validator校验包

    在Java Web开发中,Spring MVC和Hibernate Validator是两个非常重要的组件。Spring MVC是Spring框架的一部分,主要用于构建MVC(Model-View-Controller)结构的Web应用程序,而Hibernate Validator则是Java Bean ...

Global site tag (gtag.js) - Google Analytics