提交响应后无法转发

提交响应后无法转发

这段报错代码是为什么?

以下为报错内容和login相关代码

问题描述:

严重: 在路径为[/library]的上下文中,servlet[com.imooc.servlet.LoginServlet]的Servlet.service()引发异常

java.lang.IllegalStateException: 提交响应后无法转发

at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:325)

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:315)

at com.imooc.servlet.LoginServlet.doGet(LoginServlet.java:55)

at com.imooc.servlet.LoginServlet.doPost(LoginServlet.java:62)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at com.imooc.fiter.AuthFilter.doFilter(AuthFilter.java:36)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at com.imooc.fiter.EncodeFilter.doFilter(EncodeFilter.java:30)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:201)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:698)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364)

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)

相关代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="css/login.css">
<script type="text/javascript">
function changeImg() {
var codeImg = document.getElementById("codeImg");
codeImg.src = "${pageContext.request.contextPath }/KaptchaServlet?time="
+ new Date().getTime();
}
</script>
</head>
<body>
<div class="login">
<div class="header">
<h1>
<a href="/login.do">登录</a>
<p>${ msg }</p>
</h1>
<button></button>
</div>
<form action="${pageContext.request.contextPath }/login.do"
method="post">
<div class="name">
<input type="text" id="name" name="username">
<p></p>
</div>
<div class="pwd">
<input type="password" id="pwd" name="password">
<p></p>
</div>
<div class="code">
<input type="text" id="code" name="verifyCode" style="width: 150px">
&nbsp;&nbsp;&nbsp;&nbsp; <img id="codeImg" onclick="changeImg()"
src="${pageContext.request.contextPath }/KaptchaServlet"
style="width: 150px; height: 42px; vertical-align: middle;">
<p></p>
</div>
<div class="btn-red">
<input type="submit" value="登录" id="login-btn">
</div>
</form>
</div>
</body>
</html>

相关代码:

相关代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>library</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置Kaptcha验证码 -->
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
<!-- 修改验证码长度 -->
<init-param>
<param-name>kaptcha.textproducer.char.length</param-name>
<param-value>4</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>KaptchaServlet</servlet-name>
<url-pattern>/KaptchaServlet</url-pattern>
</servlet-mapping>
<!-- 配置登录过滤器,/*代表拦截所有请求 -->
<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>com.imooc.fiter.EncodeFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.imooc.fiter.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>


package com.imooc.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc.domain.User;
import com.imooc.servers.UserService;
import com.imooc.servers.impl.UserServiceImpl;

/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获得session中保存的验证码的信息
String code1 = (String) request.getSession()
.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
// 接受数据
String username = request.getParameter("username");
String password = request.getParameter("password");
// 封装数据
User user = new User(username, password);
// 处理数据:完成登录
UserService userService = new UserServiceImpl();
// 获得用户列表的集合
List<User> userList = (List<User>) getServletContext().getAttribute("userList");
User existUser = userService.login(userList, user);
// jsp显示结果
// 调用了login方法下面就是要判断了
if (existUser == null) {
// 登录失败
request.setAttribute("msg", "用户名或密码错误!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
} else {
// 登录成功
// 将用户信息保存
request.getSession().setAttribute("existUser", existUser);
response.sendRedirect(request.getContextPath() + "/categoryList.jsp");
}
// 完成验证码的校验:
// 接收前台表单提交的验证码的信息
String code2 = request.getParameter("verifyCode");
if (code2 == null || !code2.equalsIgnoreCase(code1)) {
request.setAttribute("msg", "验证码输入不正确!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}

相关代码:

相关代码:

package com.imooc.fiter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc.domain.User;

public class AuthFilter implements Filter {
public AuthFilter() {
}

public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 记得这里要强转一下request为它的子类HttpServletrequest,response同理
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;

// 获取唯一资源地址
String uri = req.getRequestURI().toString();
// 对后缀进行放行
// 当查找到符合条件的字段时放行,然后返回
if (uri.indexOf(".css") != -1 || uri.indexOf(".jpg") != -1 || uri.indexOf(".png") != -1
|| uri.indexOf("login") != -1 || uri.indexOf(".js") != -1 || uri.indexOf("eckImg") != -1
|| uri.indexOf("Servlet") != -1) {
chain.doFilter(request, response);
return;
}

// 对Session中是否有用户进行过滤
// 先从Session域中获取一下
User user = (User) req.getSession().getAttribute("existUser");
// 判断一下是否为空,空字符串是否等于existUser,如果为空则说明还未登录,并转发回登录页面
if (user == null || "".equals(user)) {
// 未登录
req.getSession().setAttribute("msg", "用户未登录");
res.sendRedirect(req.getContextPath() + "/login.jsp");
return;
} else {
// 登录了就放行
chain.doFilter(request, response);
return;
}

}

public void init(FilterConfig fConfig) throws ServletException {
}

}


​package com.imooc.fiter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EncodeFilter implements Filter {
private String encoding;
@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse rep=(HttpServletResponse)response;
req.setCharacterEncoding(encoding);
rep.setCharacterEncoding(encoding);
rep.setContentType("text/html;charset="+encoding);
chain.doFilter(request,response);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding=filterConfig.getInitParameter("encoding");
}

}

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,根据报错信息,提交响应后无法转发,一般出现重复的重定向或者转发,就会出现这个异常。检查贴出代码,同学在第一次判断完成,并执行跳转后,并没有书写return等跳出语句,此时会继续向下执行,就会出现提交响应后无法转发的情况,建议添加return语句再来试试,比如

http://img1.sycdn.imooc.com//climg/609b4adc09d3445708190332.jpg

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师