【问题标题】:Servlet Filter not working [duplicate]Servlet过滤器不起作用[重复]
【发布时间】:2013-06-29 21:30:55
【问题描述】:

我想在会话未打开或关闭时重定向到起始页。我添加了 Servlet 过滤器,但它不起作用。

我的 SessionFilter 类:

public class SessionFilter implements Filter {

    private ArrayList<String> urlList;

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        String url = request.getServletPath();
        HttpSession session = request.getSession(false);

        if (new Bean().getLoggedIn() || urlList.contains(url) || session != null){
            chain.doFilter(req, resp);
        }
        else{
            response.sendRedirect("index.jsf");
        }
    }

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

        }
    }

    public void destroy() {
    }

}


我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
           version="2.5">
    <filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>com.tsystems.demail.SessionFilter</filter-class>
        <init-param>
            <param-name>avoid-urls</param-name>
            <param-value>/index.jsf, /registration.jsf</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>SessionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.jsf</welcome-file>
    </welcome-file-list>
</web-app>

当我登录时new Bean().getLoggedIn() 是真的。注销时 - 错误。如何更改我的过滤器?我哪里出错了?

【问题讨论】:

  • Bean 是什么?您的意思是每次都创建一个新的吗?
  • "but it's not working" 它怎么不工作,它根本不重定向,它重定向到错误的页面,你得到一个 HTTP 500,什么也没发生,什么? else 块中的代码是否完全执行,由调试器确定?请详细点,谢谢。
  • @DaveNewton 我的 Bean 类:pastebin.com/EKU1d0EY
  • @Keith 我没有重定向,当会话关闭或未打开时。
  • 检查会话是否为空,并检查你的 urlList/url 值,我认为它不会像你想要的那样工作

标签: java jsf servlets servlet-filters


【解决方案1】:

我认为你应该尝试:

 response.sendRedirect(request.getContextPath() + "/index.jsf");

代替:

response.sendRedirect("index.jsf"); 

但请检查以下示例:

我假设在登录方法中,我将当前用户放在会话中,这样当用户连接时我可以获得非空对象!

方法登录:

 ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();

 Map<String, Object> sessionMap = externalContext.getSessionMap();

 sessionMap.put("User", wantConnect);   

现在,如果用户尝试使用 url-pattern 成员(例如 http://www.domain.com/member/....)访问某些页面,则会调用以下过滤器。

@WebFilter("/member/*")  
public class RequestInterceptor implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws ServletException, IOException {

      HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession();

        if (session == null || session.getAttribute("User") == null) {
            response.sendRedirect(request.getContextPath() + "/index.xhtml"); // No logged-in user found, so redirect to login page.
        } else {
            chain.doFilter(req, res); // Logged-in user found, so just continue request.
        }




}

@Override
public void destroy() {
    // Cleanup global variables if necessary.
}

}

这是我的 web.xml

<filter>
    <description>Requires user to log in as a member</description>
    <filter-name>RequestInterceptor</filter-name>
    <filter-class>fr.atoswg.peu.security.RequestInterceptor</filter-class>
</filter>
<filter-mapping>
    <filter-name>RequestInterceptor</filter-name>
    <url-pattern>/member/*</url-pattern>
</filter-mapping>

希望对你有帮助:)!

【讨论】:

    【解决方案2】:

    请注意 response.sendRedirect("index.jsf")

    相对路径作为参数。因此,假设 index.jsf 位于 Web 应用程序的根目录中,您可能希望使用值“/index.jsf”(以正斜杠开头)来处理所有级别的重定向。如果没有,像这样的网址:

    /folder1/folder2/somePage.jsf
    

    将被重定向到

    /folder1/folder2/index.jsf
    

    而不是

     /index.jsf
    

    【讨论】:

    • 我得到相同的结果
    • 您是否验证过您的 else 块内的重定向行实际上已到达?通过使用调试器或日志语句?
    • 我确定没问题
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 2013-06-28
    • 2015-07-15
    • 2021-02-19
    • 2016-11-07
    • 2015-12-10
    • 2013-09-07
    • 2010-10-15
    相关资源
    最近更新 更多