`

java关于ServletConfig FilterConfig什么用

    博客分类:
  • SSH
 
阅读更多

具体的使用方法你可以在google上搜索 “filter 过滤器”,FilterConfig可以获取部署描述符文件(web.xml)中分配的过滤器初始化参数。
针对你的问题回答,结果就是说FilterConfig可以获得web.xml中,以 filter 作为描述标签内的参数。

定义:
FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。
FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参数。

实例:
将下面的代码加入到web.xml中,试用FilterConfig就可以获得以 filter 作为描述标签内的参数。

<!-- The Cache Filter -->
<filter>
<!-- 设计过滤处理类,生成静态页面 -->
<filter-name>CacheFilter</filter-name>
<filter-class>com.jspbook.CacheFilter</filter-class>

<!-- 不需要缓存的URL -->
<init-param>
<param-name>/TimeMonger.jsp</param-name>
<param-value>nocache</param-value>
</init-param>

<init-param>
<param-name>/TestCache.jsp</param-name>
<param-value>nocache</param-value>
</init-param>

<!-- 缓存超时时间, 单位为秒 -->
<init-param>
<param-name>cacheTimeout</param-name>
<param-value>600</param-value>
</init-param>

<!-- 是否根据浏览器不同的地区设置进行缓存(生成的缓存文件为 test.jspid=1_zh_CN 的格式) -->
<init-param>
<param-name>locale-sensitive</param-name>
<param-value>true</param-value>
</init-param>

</filter>

<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

用法:

filterConfig.getInitParameter("locale-sensitive"); 得到的就是 ture
filterConfig.getInitParameter("cacheTimeout"); 得到的就是 600
filterConfig.getInitParameter(request.getRequestURI()); 得到的就是param-name 对应的 param-value 值

 

下面例子是openiam源码中认证过滤器的例子:

 

package org.openiam.webadmin.filter;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.openiam.base.ws.Response;
import org.openiam.base.ws.ResponseStatus;
import org.openiam.idm.srvc.auth.dto.Login;
import org.openiam.idm.srvc.auth.dto.SSOToken;
import org.openiam.idm.srvc.auth.service.AuthenticationConstants;
import org.openiam.idm.srvc.auth.service.AuthenticationService;
import org.openiam.idm.srvc.auth.ws.LoginDataWebService;
import org.openiam.idm.srvc.menu.dto.Menu;
import org.openiam.idm.srvc.menu.ws.NavigatorDataWebService;
import org.openiam.idm.srvc.user.ws.UserDataWebService;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
import java.util.ResourceBundle;
import java.util.StringTokenizer;

/**
 * <p>
 * <code>SelfServiceAuthFilter</code> <font face="arial"> is a Filter which checks user
 * authentication. If the userId is in session, he/she has been authenticated.
 * If not authenticated, authentication is checked and then userId is set in session
 * If userId is not provided in the request object, control is passed to the
 * the login application and the Filter chain is terminated.
 * <p/>
 * <p/>
 * </font>
 * </p>
 */
public class SelfServiceAuthFilter implements javax.servlet.Filter {

    private static final Log LOG = LogFactory.getLog(SelfServiceAuthFilter.class);
    private static ResourceBundle res = ResourceBundle.getBundle("securityconf");
    private String SELFSERVICE_BASE_URL = res.getString("SELFSERVICE_BASE_URL");
    private String SELFSERVICE_CONTEXT = res.getString("SELFSERVICE_CONTEXT");
    private String defaultLang = "en";

    private FilterConfig filterConfig = null;

    private UserDataWebService userServiceClient;
    private AuthenticationService authServiceClient;
    private LoginDataWebService loginServiceClient;

    private NavigatorDataWebService navServiceClient;

    private String expirePage;
    private String excludePath;
    private String publicLeftMenuGroup;
    private String publicRightMenuGroup1;
    private String publicRightMenuGroup2;
    private String publicRightMenuGroup3;
    private String leftMenuGroup;
    private String rightMenuGroup1;
    private String rightMenuGroup2;
    private String rightMenuGroup3;
    private String rootMenu;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        this.expirePage = filterConfig.getInitParameter("expirePage");
        this.excludePath = filterConfig.getInitParameter("excludePath");
        this.defaultLang = filterConfig.getInitParameter("defaultLang");
        this.rootMenu = filterConfig.getInitParameter("rootMenu");
        this.leftMenuGroup = filterConfig.getInitParameter("leftMenuGroup");
        this.rightMenuGroup1 = filterConfig.getInitParameter("rightMenuGroup1");
        this.rightMenuGroup2 = filterConfig.getInitParameter("rightMenuGroup2");
        this.rightMenuGroup3 = filterConfig.getInitParameter("rightMenuGroup3");
        this.publicLeftMenuGroup = filterConfig.getInitParameter("publicLeftMenuGroup");
        this.publicRightMenuGroup1 = filterConfig.getInitParameter("publicRightMenuGroup1");
        this.publicRightMenuGroup2 = filterConfig.getInitParameter("publicRightMenuGroup2");
        this.publicRightMenuGroup3 = filterConfig.getInitParameter("publicRightMenuGroup3");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        LOG.debug("SelfServeAuthFilter:doFilter");


        ServletContext context = getFilterConfig().getServletContext();

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpSession session = request.getSession();

        if (request.getMethod().equalsIgnoreCase("POST")) {
            LOG.info("Post operation - pass through request");
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        String url = request.getRequestURI();
        LOG.debug("* Requested url=" + url);

        String backUrl = (String) session.getAttribute("backUrl");
        if(StringUtils.isEmpty(backUrl)) {
            backUrl = servletRequest.getParameter("backUrl");
            if(StringUtils.isEmpty(backUrl)) {
                backUrl = SELFSERVICE_BASE_URL + "/" + SELFSERVICE_CONTEXT;
            }
            session.setAttribute("backUrl", backUrl);
        }
        if (url == null || url.equals("/") || url.endsWith("login.gsp") || isExcludeObject(url) || isPublicUrl(url)) {
            LOG.info("Pass through request for object");
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        LOG.debug("Validating url: " + url);

        // validate the token. If the token is not valid then redirect to the login page
        // invalidate the session
        String token = (String) session.getAttribute("token");
        String principal = (String)session.getAttribute("login");
        if(StringUtils.isEmpty(principal)) {
            principal = servletRequest.getParameter("lg");
        }

        // if token was not found in Request parameters try to find in Cookies
        if(StringUtils.isEmpty(token)) {
            token = servletRequest.getParameter("tk");
            session.setAttribute("token", token);
        }

        String sessionUserId = (String) session.getAttribute("userId");

        if (StringUtils.isEmpty(sessionUserId) && StringUtils.isEmpty(token)) {
            // token is missing
            LOG.debug("token is null");
            response.sendRedirect(SELFSERVICE_BASE_URL+"/"+SELFSERVICE_CONTEXT+expirePage);
            return;

        }

        // get the user in the token and make sure that user in the token is the same as the one in the session
        LOG.debug("Validating token");
        if (isCode(url) && !isPublicUrl(url)) {
            sprinBeansInitialization(context);

            String decString = (String) loginServiceClient.decryptPassword(token).getResponseValue();

            StringTokenizer tokenizer = new StringTokenizer(decString, ":");
            if (tokenizer.hasMoreTokens()) {
                String decUserId = tokenizer.nextToken();
                if(StringUtils.isNotEmpty(decUserId)) {
                    session.setAttribute("userId", decUserId);
                }
            }
            /* There is no User attribute so redirect to login page */
            String userId =  (String)session.getAttribute("userId");

            if(userId == null) {
                LOG.debug("Token validation failed...");
                session.invalidate();
                response.sendRedirect(SELFSERVICE_BASE_URL+"/"+SELFSERVICE_CONTEXT+expirePage);
                return;
            }
            // userId is not null

                String ip = request.getRemoteHost();
            if (StringUtils.isEmpty(principal)) {
                Login l = loginServiceClient.getPrimaryIdentity(userId).getPrincipal();
                principal = l.getId().getLogin();
                session.setAttribute("userId", userId);
                session.setAttribute("login", principal);
            }
                Response resp =  authServiceClient.renewToken(principal, token, AuthenticationConstants.OPENIAM_TOKEN, ip);

                //BooleanResponse resp = authService.isUserLoggedin(userId, ip);
                // if not logged in then show the login page
                if (resp.getStatus() == ResponseStatus.FAILURE) {
                    //if (resp == null || !resp.getValue().booleanValue()) {
                    session.invalidate();
                    response.sendRedirect(request.getContextPath() + expirePage);
                    return;
                }else {
                    // get the new token and update the session with this value
                    SSOToken ssoToken = (SSOToken)resp.getResponseValue();
                    if (ssoToken != null ) {
                        session.setAttribute("token", ssoToken.getToken());
                    }

                    // get the menus that the user has permissions too
                    List<Menu> menuList = navServiceClient.menuGroupByUser(rootMenu, userId, defaultLang).getMenuList();

                    session.setAttribute("permissions", menuList);

                    // user has been authentication - show the private menus
                    session.setAttribute("privateLeftMenuGroup",
                            navServiceClient.menuGroupSelectedByUser(leftMenuGroup, userId, defaultLang).getMenuList());
                    session.setAttribute("privateRightMenuGroup1",
                            navServiceClient.menuGroupSelectedByUser(rightMenuGroup1, userId, defaultLang).getMenuList());
                    session.setAttribute("privateRightMenuGroup2",
                            navServiceClient.menuGroupSelectedByUser(rightMenuGroup2, userId, defaultLang).getMenuList());

                    session.setAttribute("privateRightMenuGroup3",
                            navServiceClient.menuGroupSelectedByUser(rightMenuGroup3, userId, defaultLang).getMenuList());

                }

            }

        filterChain.doFilter(servletRequest, servletResponse);
    }

    public boolean isCode(String url) {

        if (url.contains(".jsp") || url.contains(".gsp")) {
            return true;
        }
        return false;
    }


    private void sprinBeansInitialization(ServletContext context) {
        if(authServiceClient == null || loginServiceClient == null || userServiceClient == null) {
// get the application context
            WebApplicationContext webContext = WebApplicationContextUtils.getWebApplicationContext(context);
            if(authServiceClient == null) {
                authServiceClient =  (AuthenticationService)webContext.getBean("authServiceClient");
            }
            if(loginServiceClient == null) {
                loginServiceClient =  (LoginDataWebService)webContext.getBean("loginServiceClient");
            }
            if(userServiceClient == null) {
                userServiceClient =  (UserDataWebService)webContext.getBean("userServiceClient");
            }
            if(navServiceClient == null) {
                navServiceClient = (NavigatorDataWebService)webContext.getBean("navServiceClient");
            }
        }
    }

    public boolean isExcludeObject(String url) {
        return url.endsWith(".js") || url.endsWith(".jpg") || url.endsWith(".css") || url.endsWith(".gif") || url.endsWith(".png");
    }

    public boolean isPublicUrl(String url) {
        return url.contains(excludePath);
    }

    @Override
    public void destroy() {
        filterConfig = null;
    }

    public FilterConfig getFilterConfig() {
        return filterConfig;
    }


}

分享到:
评论

相关推荐

    ServletContext与ServletConfig关系

    ServletContext与ServletConfig关系

    javaWEB总结(3):ServletConfig对象

    ServletConfig对象的试验代码

    java中文servlet API .chm

    这个api是自己做的,以前学习的时候找不到中文的servletAPI,所以在学习过程中学制作的,全是自己理解翻译的。如有看不懂或不能理解的请多多包涵。格式是.chm

    ServletConfig与ServletContext.docx

    注意:每个servlet有一个ServletConfig,每个Web应用有一个ServletContext.要把初始化参数认为是部署时常量,可用在运行时得到这些初始化参数,但不能设置初始化参数,根本没有setInitParameter().如果修改XML来改变...

    Java服务器程序设计

    用java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和...

    JavaEE中关于ServletConfig的小结

    ServletConfig是针对特定的Servlet的参数或属性。ServletConfig是表示单独的Servlet的配置和参数,只是适用于特定的Servlet。从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个...

    ServletConfig的描述

    NULL 博文链接:https://shoushounihao.iteye.com/blog/1919541

    深入体验Java Web开发内幕

    【内容简介】  本书深刻且通俗地揭示Java Web开发内幕,使您由内而外地明白使用Java进行Web应用开发的全过程——从XML基础知识到HTTP详述及相关体验,从用Tomcat配置Web站点到HttpServletResponse和...

    JAVA J2EE 类库文档

    FilterConfig GenericServlet HttpServlet HttpServletRequest HttpServletRequestWrapper HttpServletResponse HttpServletResponseWrapper HttpSession HttpSessionActivationListener ...

    java 面试题 总结

    16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,...

    ServletConfig

    博文链接:https://hotfisher.iteye.com/blog/92177

    ServletContext与ServletConfig的深度分析

    很清楚的讲解了ServletContext和ServletConfig,不光有理论上的讲解,还有例子。

    史上最全Java面试大全

    6.如何用css约束一个层不可见? 24 7.说出数据连接池的工作机制是什么 24 8. 多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 25 9.一个页面在打开时,需要处理一些事情(比如弹出一个广告页),需要...

    servletAPI中文版(TXT格式,自己翻译)

    ServletConfig getServletConfig() 返回传递到servlet的init()方法的ServletConfig对象 void service(ServletRequest request, ServletResponse response)throws ServletException,IOException 处理request对象中...

    【动力节点】Java经典教程_Servlet经典实战视频教程

    教程名称: 【动力节点】Java经典教程_Servlet 经典实战视频教程动力节点推出的Java视频教程主要包含两大部分内容:第一部分为Servlet基础。包括Servlet生命周期、ServletConfig、ServletContext、欢迎页头面的设置...

    超级有影响力霸气的Java面试题大全文档

    19、同步和异步有何异同,在什么情况下分别使用他们?举例说明。  如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,...

    超全面javaweb教程28天第9天 6 ServletConfig介绍

    超全面javaweb教程28天第9天_6_ServletConfig介绍

    JAVA servlet API说明文档

    servlet容器的详细说明,包括里面接口的方法。内容如下:RequestDispatch, servlet, servletConfig, servletContext。。

Global site tag (gtag.js) - Google Analytics