- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在 Spring MVC 中创建 servlet 过滤器时,出现以下异常。
[javax.servlet.ServletException: java.lang.IllegalStateException: Cannot create a session after the response has been committed] with root cause
当我输入系统输出时,我可以理解异常发生在重定向行,但不明白为什么
谁能告诉我一些解决方案
SessionFilter.java
public class SessionFilter implements Filter {
private ArrayList<String> urlList;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String url = request.getServletPath();
boolean allowedRequest = false;
if(urlList.contains(url)) {
allowedRequest = true;
}
if (!allowedRequest) {
HttpSession session = request.getSession(false);
if (null == session) {
System.out.println("preparing for redirect");
response.sendRedirect("index.jsp");
}
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("entered init");
String urls = config.getInitParameter("avoid-urls");
StringTokenizer token = new StringTokenizer(urls, ",");
urlList = new ArrayList<String>();
while (token.hasMoreTokens()) {
urlList.add(token.nextToken());
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>SpringMVCHibernate</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.common.dao.SessionFilter</filter-class>
<init-param>
<param-name>avoid-urls</param-name>
<param-value>index.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
:
:
:
最佳答案
简单简短地回答您的问题:
为了避免这种情况,你应该有一个返回语句,或者避免重定向或转发请求,或者这些事情应该由过滤器链中的最后一个过滤器来完成。
有关更多详细信息,您可以阅读以下内容:
当响应已经提交并刷新给用户时,当您尝试再次发送响应时,会发生此异常。例如:
在下面的示例代码中,首先请求将被转发到index_test.jsp,响应将刷新到用户,然后控件将再次返回过滤器并尝试向用户发送另一个响应(重定向),并且它将会失败。
通常我们会检查过滤器中的多个条件,并相应地进行转发和重定向,如果满足两个条件,那么就会产生问题。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.getRequestDispatcher("index_test.jsp").forward(request, response);
((HttpServletResponse)response).sendRedirect("new.jsp");
chain.doFilter(request, response);
}
您的案例的解决方案:
为了避免这种情况,你应该有一个返回语句,或者避免重定向或转发请求,或者这些事情应该由过滤器链中的最后一个过滤器来完成。
所以你可以将代码更改为:
public class SessionFilter implements Filter {
private ArrayList<String> urlList;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String url = request.getServletPath();
boolean allowedRequest = false;
if(urlList.contains(url)) {
allowedRequest = true;
}
if (!allowedRequest) {
HttpSession session = request.getSession(false);
if (null == session) {
System.out.println("preparing for redirect");
response.sendRedirect("index.jsp");
return;
}
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("entered init");
String urls = config.getInitParameter("avoid-urls");
StringTokenizer token = new StringTokenizer(urls, ",");
urlList = new ArrayList<String>();
while (token.hasMoreTokens()) {
urlList.add(token.nextToken());
}
}
关于java - 在 doFilter 方法中获取 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24237015/
在 Filter.doFilter 中方法我打了这个电话chain.doFilter . doFilter 在 doFilter 中做什么?不是递归调用吗? 最佳答案 Servlet 过滤器是 Cha
你能帮忙看看为什么doFilter没有被调用吗 web.xml: log4jConfigLocation /WEB-INF/log4j.properties org.springfr
我已经搜索并看到了有关此问题的几个帖子,但没有找到如何可能的答案。 我想要做的是在过滤器链之后添加 header , public void doFilter(ServletRequest reque
我设置服务器的经验几乎为零,但目前我的工作是设置一台(不要问为什么)。这是一个 apache-tomcat6 服务器。 我一步步遵循了一些说明,当需要测试一切是否正常时,我得到的是: 我知道这有点盲目
实际上,我对 Java EE 规范还很陌生,因为我还很年轻。我从来没有在学校学过这些东西,而且我在使用 doFilter 方法时遇到了奇怪的行为。 考虑以下过滤器: @WebFilter(filter
在这个 dofilter 方法中,ServletRequest 总是返回空值,我不知道是什么原因? 过滤器.java public void doFilter(ServletRequest reque
我希望在 doFilter() 函数完成运行后添加一个 HTTP header 。 public void doFilter(ServletRequest request, ServletRespon
我已经在 Spring Boot 应用程序中定义了 servlet 过滤器实现。我所有的电话都只能得到 200 条回复。如何在 dofilter 方法中获得适当的响应? public void do
为了这就是我需要发生的事情: 请求 blah.com/test ServletFilter A - 创建配置文件,然后调用 chain.doFilter ServletFilter B(因为 url
我正在学习 Java EE servlet 教程并尝试了 mood example .我注意到 doFilter 被调用了两次,一次 servlet 调用在链中,第二次不在链中。 我在 TimeOfD
当我在 Spring MVC 中创建 servlet 过滤器时,出现以下异常。 [javax.servlet.ServletException: java.lang.IllegalStateExce
因此,我一直在观察有关此主题的一些答案,并且我知道在 doFilter() 调用完成后,现在修改响应 header 已经太晚了,为了最好地处理这种情况,我应该使用响应包装器。 我想知道如何处理这样的情
我使用Filter来拦截每个请求,在filter中我只能获取ServletRequest输入流,它返回空输入流,以获取输入流。看来我需要获取HttpServletRequest。如何实现这一目标?我尝
我正在使用 dropwizard 构建应用程序。 我创建了一个过滤器来拦截并记录调用服务的相关 ID。 如果传入请求的 header 中没有 header “Correlation-Id”,我们会将一
我正在尝试在浏览器上显示 pdf 作为输出。这是我在 servlet 的 dofilter 类中的代码。我已经在这一行得到了一个可以正确渲染 pdf 的字节数组 --> byte[] pdfArray
您好,我创建了一个 Filter 类并配置了 web.xml,如下所示: LoginFilter my.web.auth.LoginFilter test-
我已经搜索并看到了关于这个问题的几个答案,但仍然不知道这是怎么可能的...... 我被要求实现一个过滤器,该过滤器在响应 header 中返回 HTTP 请求的响应时间,例如。响应 header :X
javax.servlet.Filter对象既可用于身份验证(其中 Filter 需要在需要完成任何 servlet 工作之前捕获请求),也可用于 XSLT 转换(其中 servlet 需要完全完成生
我有一个 Tomcat 过滤器,它根据 URL 将请求委托(delegate)给处理对象。这是 FilterChain 中唯一的过滤器。我有一个 Ajax 应用程序可以通过大量请求来处理此过滤器。 最
我有一个带有 doFilter 方法的过滤器类。在 doFilter 方法中,我设置了一个 cookie,如下所示 HttpServletResponse httpResp=(HttpServletR
我是一名优秀的程序员,十分优秀!