【问题标题】:How we can use Servlet Filter for sessioncheck? [duplicate]我们如何使用 Servlet 过滤器进行会话检查? [复制]
【发布时间】:2015-10-02 21:47:42
【问题描述】:

我是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>

我的过滤器类是

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);
}
}

【问题讨论】:

  • @Balusc 这不是这个问题的答案。只需检查这个问题并回答它

标签: java servlets


【解决方案1】:

问题是您已经使用response.sendRedirect("login") 为无效会话重定向了login page 上的用户。但是,您还尝试在重定向 chain.doFilter(req, res) 后继续请求链。

在这里尝试使用return 关键字:

if (null == session) {
    response.sendRedirect("login");
    return; // added
}

【讨论】:

  • 错误更改为“此网页有重定向循环”
  • @AjmalMuhammad 这是只有 chrome 行为还是 IE/firefox 也显示类似行为?
  • firefox 显示此错误“页面未正确重定向 Firefox 检测到服务器正在以永远不会完成的方式重定向此地址的请求。
  • 这是一个不同的问题,在这里得到解答:stackoverflow.com/questions/13114743/java-filter-infinite-loop
  • 谢谢 BalusC 它正在工作
猜你喜欢
  • 1970-01-01
  • 2017-11-08
  • 2013-04-06
  • 1970-01-01
  • 2012-02-03
  • 2013-09-04
  • 1970-01-01
  • 2020-10-26
  • 2012-05-07
相关资源
最近更新 更多