JSF中的Web过滤器

JSF中的Web过滤器,jsf,jakarta-ee,servlet-filters,Jsf,Jakarta Ee,Servlet Filters,我正在通过引用实现web过滤器 我的代码是 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"

我正在通过引用实现web过滤器

我的代码是

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>project_name</display-name>
    <welcome-file-list>
        <welcome-file>/project_name/faces/jsp/HomePage.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <context-param>
        <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
        <param-value>resources.application</param-value>
    </context-param>

    <context-param>
        <param-name>org.richfaces.CONTROL_SKINNING</param-name>
        <param-value>enable</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadScriptStrategy</param-name>
        <param-value>ALL</param-value>
    </context-param>
    <context-param>
        <param-name>org.richfaces.LoadStyleStrategy</param-name>
        <param-value>ALL</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.DEFAULT_EXPIRE</param-name>
        <param-value>2764800</param-value>
    </context-param>
    <context-param>
        <param-name>org.apache.myfaces.ERROR_HANDLING</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>org.ajax4jsf.handleViewExpiredOnClient</param-name>
        <param-value>true</param-value>
    </context-param>

    <filter>
        <display-name>RichFaces Filter</display-name>
        <filter-name>richfaces</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
        <init-param>
            <param-name>createTempFiles</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>maxRequestSize</param-name>
            <param-value>20000000</param-value>
        </init-param>
        <init-param>
            <param-name>enable-cache</param-name>
            <param-value>true</param-value>
        </init-param>


    </filter>

    <filter>
        <filter-name>loginFilter</filter-name>
        <filter-class>com.common.LoginFilter</filter-class>
    </filter>

     <filter-mapping>
        <filter-name>loginFilter</filter-name>
        <url-pattern>/faces/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>richfaces</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>Resource Servlet</servlet-name>
        <servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Resource Servlet</servlet-name>
        <url-pattern>/primefaces_resource/*</url-pattern>
    </servlet-mapping>
</web-app>
但我面临的问题是,我一直在低于记录

Inside Login Filter
session...org.apache.catalina.session.StandardSessionFacade@1c134e1

在控制台中,页面永远不会重定向到下一页或登录页。

这是因为您的筛选器也与登录页上的请求相匹配。它基本上是在无限循环中运行的,重定向到登录页面。基本上有两种选择:

  • 请确保登录URL未包含在筛选器映射中。将受限页面放在文件夹中,如
    /secured/*
    /app/*
    等,并将过滤器映射到该URL模式上,然后将登录页面放在外部

  • 如果当前未请求登录URL,请签入筛选器

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        boolean loggedIn = (session != null) ? session.getAttribute(IConstants.HAS_USER_ID) != null : false;
        String loginURL = request.getContextPath() + "/faces/jsp/login.jsp"; 
    
        if (!loggedIn && !request.getRequestURI().equals(loginURL)) {       
            response.sendRedirect(loginURL);
        } else {
            chain.doFilter(request, response);
        }
    }
    

  • 我实现了一个缓存过滤器。这是代码。看看这是否有帮助

    在web.xml中添加以下内容

    <filter>
        <filter-name>cache</filter-name>
        <filter-class>au.com.webapp.config.CacheFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cache</filter-name>
        <url-pattern>*.xhtml</url-pattern>
    </filter-mapping>
    

    你的url模式是什么?@TechExchange我的request.getRequestURI有问题。打印后我得到/testproject/faces/a4j/g/3_3_1.GA/org/richfaces/ui.pack.js和/eapp_online/faces/a4j/s/3_3_1.GAorg/richfaces/renderkit/html/css/basic_tware.xcss/DATB/eAELXT5DOhSIAQ!sA18_uu和/eapp_online/faces/a4j/s/3_3_1.GAorg/richfaces/renderkit/html/css/extended_both.xcss/DATB/eAELXT5DOhSIAQ!为什么你认为这是错误的?您将过滤器映射到
    /faces/*
    ,因此它将在与该URL模式匹配的所有请求上运行,包括JSF资源文件(JS/CSS/image文件)。您只需要进一步微调URL模式,或者检查请求URI是否以
    /faces/a4j/
    开头,然后跳过阻止它们。
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        HttpSession session = request.getSession(false);
        boolean loggedIn = (session != null) ? session.getAttribute(IConstants.HAS_USER_ID) != null : false;
        String loginURL = request.getContextPath() + "/faces/jsp/login.jsp"; 
    
        if (!loggedIn && !request.getRequestURI().equals(loginURL)) {       
            response.sendRedirect(loginURL);
        } else {
            chain.doFilter(request, response);
        }
    }
    
    <filter>
        <filter-name>cache</filter-name>
        <filter-class>au.com.webapp.config.CacheFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cache</filter-name>
        <url-pattern>*.xhtml</url-pattern>
    </filter-mapping>
    
    package au.com.webapp.config;
    
    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 CacheFilter implements Filter {
        private static long maxAge = 86400 * 30; // 30 days in seconds
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            String uri = ((HttpServletRequest) request).getRequestURI();
            if (uri.contains(".js") || uri.contains(".css") || uri.contains(".svg") || uri.contains(".gif")
                    || uri.contains(".woff") || uri.contains(".png")) {
                httpResponse.setHeader("Cache-Control", "max-age=" + maxAge);
            }
            chain.doFilter(request, response);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("Cache Filter started: ");
    
        }
    
        @Override
        public void destroy() {
        }
    }