这是个很常见的问题,度娘和谷歌动手就能查到,可是今天还是遇到了,因为一直做业务研发,没有直接关注这些细节。
该文章来自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
相关推荐
本项目"javaWeb项目 filter练习"主要关注了两个核心的应用场景:编码过滤和登录过滤。下面将详细介绍这两个方面的内容。 **编码过滤** 在Web应用中,数据从客户端传输到服务器时,可能会遇到编码不一致的问题,导致...
在Java Web开发中,Servlet和Filter是两个非常重要的概念。Servlet是Java提供的一个用于扩展服务器功能的接口,而Filter则是一种动态web资源过滤机制,它允许我们在数据处理流程中进行预处理和后处理,比如登录验证...
在IntelliJ IDEA(简称Idea)这个强大的Java开发工具中,我们可以创建一个新的Java类,并让它继承自`javax.servlet.Filter`接口。这个接口定义了三个方法:`doFilter()`, `init()`, 和 `destroy()`。其中,`doFilter...
下面将详细讨论Java中Filter的使用方法,包括如何创建和配置过滤器,以及上述示例中的两个具体应用场景。 1. **防止浏览器缓存页面的过滤器**: 防止浏览器缓存页面是确保每次请求都能获取最新内容的重要步骤。在...
2. **映射路径**:接着,通过两个`filter-mapping`元素配置了该拦截器的作用范围。第一个映射表示所有`.jsp`后缀的页面都将经过此拦截器;第二个映射则针对所有`.do`后缀的请求进行过滤。 #### 四、工作流程 1. **...
在Java Web开发中,Filter过滤器是一个至关重要的概念,它属于JavaWeb的三大核心组件之一,另外两个是Servlet程序和Listener监听器。Filter的主要职责在于对HTTP请求进行预处理以及对响应进行后处理,而并非直接生成...
过滤器的使用并不局限于上述两个示例。在实际应用中,过滤器可以用于执行各种任务,如日志记录、压缩响应、转换编码等。要使用过滤器,需要在Web应用的部署描述符(`web.xml`)中进行配置。例如: ```xml <filter> ...
在Java Web开发中,Servlet和Filter是两种非常重要的组件,它们在构建动态Web应用程序时起着关键作用。本文将详细探讨如何使用Servlet和Filter来实现用户登录认证。 Servlet是一种Java编程语言编写的服务器端程序,...
// 如果不满足重定向条件,继续执行链路中的下一个过滤器 return chain.filter(exchange); } } ``` 2. **使用`FilterRegistrationBean`:** 对于非反应式编程或者兼容旧版本Spring Boot的情况,我们可以使用`...
在Spring MVC中,请求转发和重定向是两种常见的页面跳转方式,它们在处理完控制器方法后用于将用户导向不同的资源。这两种跳转方式在实际应用中有着不同的使用场景和特性。 1. 请求转发(Request Forwarding) ...
这两个组件允许我们自定义异常处理和请求拦截。 1. HandlerExceptionResolver 异常处理 HandlerExceptionResolver接口用于处理在处理请求过程中发生的异常。当在DispatcherServlet中遇到异常时,它会调用`...
`filter`和`manager`这两个文件名可能代表了过滤器相关的其他内容,但没有具体的文件内容,无法给出详细的解释。通常,`filter`可能是对过滤器功能的进一步封装或抽象,而`manager`可能是一个管理多个过滤器的类,...
Filter的配置包括两个主要部分: - 编码实现:通过继承Filter接口并复写doFilter()方法来定义过滤器的具体行为。doFilter()方法中,可以对请求和响应进行处理。 - web.xml的配置:在web.xml文件中配置Filter,指定...
这两个对象都实现了`ModelMap`接口,可以在控制器方法中通过参数注入。 ```java public String handleRequest(Model model) throws Exception { model.addAttribute("message", "Hello, World!"); return "view...
ASP.NET MVC权限过滤和单点登录...权限控制和单点登录是ASP.NET MVC应用程序中的两个重要概念,通过使用AuthorizeAttribute和FormAuthentication等技术,可以实现权限控制和单点登录,提高应用程序的安全性和可靠性。
这两个Java过滤器示例展示了如何利用Servlet过滤器机制来增强Web应用程序的功能性和安全性。`ForceNoCacheFilter`通过控制缓存策略,确保了动态内容的即时性;而`CheckLoginFilter`则通过会话管理,保障了用户数据的...
### doFilter过滤器详解 #### 引言 在Java Web开发中,`doFilter`方法是Servlet过滤...上述两个示例只是过滤器众多应用场景中的冰山一角,理解并熟练掌握过滤器的使用,对于提高Web应用的安全性和性能具有重要意义。
在Java Web开发中,过滤器(Filter)是一种非常实用的功能组件,它可以对用户的请求或响应进行预处理或后处理。通过实现`javax.servlet.Filter`接口,开发者可以自定义过滤器来执行特定的操作。本文将详细介绍两个...
在Java Web开发中,Spring MVC和Hibernate Validator是两个非常重要的组件。Spring MVC是Spring框架的一部分,主要用于构建MVC(Model-View-Controller)结构的Web应用程序,而Hibernate Validator则是Java Bean ...