web.xml 配置Filter

本文介绍了一个权限Filter的实现方法,该Filter通过检查用户会话来确定是否允许访问特定资源。如果用户未登录并且尝试访问除登录页面以外的资源,Filter将重定向用户至登录页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是该Filter的源代码。

程序清单:codes/02/2.12/ filterTest/WEB-INF/src/lee/AuthorityFilter.java

 

public class AuthorityFilter implements Filter { //FilterConfig可用于访问Filter的配置信息 private FilterConfig config; //实现初始化方法 public void init(FilterConfig config){ this .config = config; } //实现销毁方法 public void destroy(){ this .config = null ; } //执行过滤的核心方法 public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException,ServletException{ //获取该Filter的配置参数 String encoding = config.getInitParameter("encoding" ); String loginPage = config.getInitParameter("loginPage" ); String proLogin = config.getInitParameter("proLogin" ); //设置request编码用的字符集 request.setCharacterEncoding(encoding); //① HttpServletRequest requ = (HttpServletRequest)request; HttpSession session = requ.getSession(true ); //获取客户请求的页面 String requestPath = requ.getServletPath(); //如果session范围的user为null,即表明没有登录 //且用户请求的既不是登录页面,也不是处理登录的页面 if ( session.getAttribute( "user" ) == null && !requestPath.endsWith(loginPage)& & !requestPath.endsWith(proLogin)){ //forward到登录页面request.setAttribute("tip" , "您还没有登录"); request.getRequestDispatcher(loginPage).forward(request, response);} else { //“放行”请求 chain.doFilter(request, response); } } }



上面Filter的doFilter方法里3行斜体字代码用于获取Filter的配置参数,而程序中粗体字代码则是此Filter的核心,①号代码按配置参数设置了request编码所用的字符集,接下来的粗体字代码判断session范围内是否有user属性——没有该属性即认为没有登录,如果既没有登录,而且请求地址也不是登录页和处理登录页,系统直接跳转到登录页面。

在web.xml文件中配置该Filter,使用init-param元素为该Filter配置参数,init-param可接受如下两个子元素:

param-name:指定参数名。

param-value:指定参数值。

该Filter的配置片段如下:
<!-- 定义Filter --> <filter> <!-- Filter的名字 --> <filter-name>authority</filter-name> <!-- Filter的实现类 --> <filter-class>lee.AuthorityFilter</filter-class> <!-- 下面3个init-param元素配置了3个参数 --> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> <init-param> <param-name>loginPage</param-name> <param-value>/login.jsp</param-value> </init-param> <init-param> <param-name>proLogin</param-name> <param-value>/proLogin.jsp</param-value> </init-param> </filter> <!-- 定义Filter拦截的URL地址 --> <filter-mapping> <!-- Filter的名字 --> <filter-name>authority</filter-name> <!-- Filter负责拦截的URL --> <url-pattern>/*</url-pattern> </filter-mapping>

 


上面配置片段中粗体字代码为该Filter指定了3个配置参数,指定loginPage为/login.jsp,proLogin为/proLogin.jsp,这表明:如果没有登录该应用,普通用户只能访问/login.jsp和/proLogin.jsp页面。只有当用户登录该应用后才可自由访问其他页面。

 

 

<servlet>
    <servlet-name>action<servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>

    <init-param>
        <param-name>detail</param-name>
        <param-value>2</param-value>
    </init-param>

    <init-param>
        <param-name>debug</param-name>
        <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>




<load-on-startup>2</load-on-startup>配置的作用
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序
3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
6)当值相同时,容器就会自己选择顺序来加载。

本文来自优快云博客,转载出处:http://blog.youkuaiyun.com/doymm2008/archive/2009/11/09/4791435.aspx

### 配置过滤器 在 `web.xml` 文件中配置过滤器涉及两个主要部分:定义过滤器及其映射关系。通过 `<filter>` 和 `<filter-mapping>` 元素来完成这一过程[^1]。 #### 定义过滤器 要创建一个新的过滤器,需使用 `<filter>` 标签并提供必要的子标签: - **<filter-name>**: 指定过滤器的名字,在整个应用程序范围内唯一。 - **<filter-class>**: 提供实现 javax.servlet.Filter 接口的具体类的全限定名。 示例如下所示: ```xml <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.ygj.control.LoginFilter</filter-class> </filter> ``` 还可以为过滤器设置初始化参数,这可以通过添加 `<init-param>` 子元素来完成。这些参数允许传递给过滤器实例化时使用的额外信息。 #### 映射过滤器到 URL 模式 一旦定义好了过滤器,则需要告诉服务器哪些请求应该被此过滤器处理。这是由 `<filter-mapping>` 实现的,它同样有两个重要的子标签: - **<filter-name>**: 应与此过滤器定义中的名字相匹配。 - **<url-pattern>**: 描述应触发过滤器执行的一组URL模式。 下面是一个完整的例子: ```xml <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> ``` 上述配置意味着任何以 `/secure/` 开头的HTTP请求都将经过名为 LoginFilter 的过滤器处理[^3]。 除了传统的 XML 方式外,也可以利用 Java 注解的方式简化配置工作量[@WebFilter(filterName="EncodingFilter", urlPatterns={"*.action"})][^2];不过本话题聚焦于基于 web.xml 的方式。 对于某些特定类型的过滤功能,比如解决跨域资源共享(CORS)问题或者统一字符集编码转换等场景,可能还需要引入第三方库的支持,并相应调整依赖项列表[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值