我是java的新手。我尝试使用Servlet过滤器进行会话检查。我的代码如下。但是我跑步时遇到了错误。请帮助纠正错误。错误代码是
HTTP Status 500 - Cannot forward after response has been committed
type Exception report
message Cannot forward after response has been committed
description The server encountered an internal error that prevented it from fulfilling this request.
我的代码是
我的web.xml
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.sample.wordnik.servlet.LoginServlet</servlet-class>
</servlet>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>
com.sample.wordnik.filter.SessionFilter
</filter-class>
<init-param>
<param-name>avoid-urls</param-name>
<param-value>login.jsp,signup.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
我的Filter类是
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
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 javax.servlet.http.HttpSession;
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) {
response.sendRedirect("login");
}
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig config) throws ServletException {
String urls = config.getInitParameter("avoid-urls");
StringTokenizer token = new StringTokenizer(urls, ",");
urlList = new ArrayList<String>();
while (token.hasMoreTokens()) {
urlList.add(token.nextToken());
}
}
}
我的LoginServlet是
public class LoginServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
}
}
答案 0 :(得分:1)
问题是您已使用login page
将用户重定向到response.sendRedirect("login")
以获取无效会话。但是,在重定向chain.doFilter(req, res)
后,您还尝试继续使用请求链。
尝试在此处使用return
关键字:
if (null == session) {
response.sendRedirect("login");
return; // added
}