### Struts2配置过滤器详解 #### 一、概述 Struts2是基于MVC模式的一个开源框架,它能够帮助开发者构建出结构清晰且易于维护的Web应用。在实际开发过程中,为了实现某些功能(例如用户认证、权限控制等),往往需要在请求进入核心处理逻辑之前进行一些预处理工作,这就需要用到过滤器(Filter)机制。本文将通过一个具体的示例来详细介绍如何在Struts2项目中配置过滤器。 #### 二、过滤器配置实例分析 ##### 2.1 web.xml配置解析 在给定的web.xml配置文件中,可以看到对`SessionInvalidate`过滤器进行了定义和映射: ```xml <!-- struts2过滤器 --> <filter> <filter-name>SessionInvalidate</filter-name> <filter-class>com.accp.util.SessionCheckFilter</filter-class> <init-param> <param-name>checkSessionKey</param-name> <param-value>logonname</param-value> </init-param> <init-param> <!-- 登录成功后跳转的URL --> <param-name>redirectURL</param-name> <param-value>/menu/index.jsp</param-value> </init-param> <init-param> <!-- 不需要检查会话的URL列表 --> <param-name>notCheckURLList</param-name> <param-value>/menu/index.jsp,/index.jsp,/menu/elecUserAction_login.action</param-value> </init-param> </filter> <!-- 需要进行过滤的URL --> <filter-mapping> <filter-name>SessionInvalidate</filter-name> <url-pattern>/system/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SessionInvalidate</filter-name> <url-pattern>/siteEquapment/*</url-pattern> </filter-mapping> ``` 这段配置中,首先定义了一个名为`SessionInvalidate`的过滤器,并指定了其实现类为`com.accp.util.SessionCheckFilter`。接着通过`init-param`元素设置了三个初始化参数: - `checkSessionKey`: 用于指定需要检查的Session中的键名。 - `redirectURL`: 如果未通过检查,则重定向到该URL。 - `notCheckURLList`: 列出了不需要进行Session检查的URL列表。 通过`<filter-mapping>`元素指定了哪些URL路径需要被此过滤器处理。 ##### 2.2 SessionCheckFilter实现分析 接下来分析`SessionCheckFilter`的具体实现细节: ```java package com.accp.util; import java.io.IOException; import java.util.HashSet; import java.util.Set; 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 SessionCheckFilter implements Filter { protected FilterConfig filterConfig = null; private String redirectURL = null; private Set<String> notCheckURLList = new HashSet<>(); private String sessionKey = null; public void destroy() { // TODO Auto-generated method stub } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest request1 = (HttpServletRequest) request; HttpServletResponse response1 = (HttpServletResponse) response; HttpSession session = request1.getSession(); if (session.getAttribute(sessionKey) != null) { chain.doFilter(request, response); return; } // 如果未通过Session验证,则重定向到登录页面 response1.sendRedirect(redirectURL); } } ``` 在`SessionCheckFilter`类中,实现了`Filter`接口并重写了`doFilter`方法。该方法的主要逻辑如下: - 获取当前HTTP请求对象(`HttpServletRequest`)和响应对象(`HttpServletResponse`)。 - 通过请求对象获取当前用户的会话(`HttpSession`)。 - 检查Session中是否存在指定的键名(`sessionKey`),如果存在则允许请求继续传递给下一个过滤器或目标资源;否则,根据`redirectURL`配置的值进行重定向操作。 #### 三、总结与思考 通过以上分析可以看出,在Struts2项目中配置过滤器是一种非常实用的方法,可以有效地实现对用户请求的预处理工作。需要注意的是,在实际应用中还应考虑更多细节问题,比如如何处理不同环境下的配置差异、如何更灵活地管理过滤器链等。希望本文能为你在Struts2框架的学习和实践中提供一定的帮助。
<!-- struts2权限过滤器 -->
<filter>
<filter-name>SessionInvalidate</filter-name>
<!-- 过滤器的路径(自定义的) -->
<filter-class>com.accp.util.SessionCheckFilter</filter-class>
<init-param>
<param-name>checkSessionKey</param-name>
<param-value>logonname</param-value>
</init-param>
<init-param>
<!-- 被过滤后从定向到 /menu/index.jsp-->
<param-name>redirectURL</param-name>
<param-value>/menu/index.jsp</param-value>
</init-param>
<init-param>
<!-- 不被拦截的请求集合 -->
<param-name>notCheckURLList</param-name>
<param-value>/menu/index.jsp,/index.jsp,/menu/elecUserAction_login.action</param-value>
</init-param>
</filter>
<!-- 需要进行过滤判断的所有jsp -->
<filter-mapping>
<filter-name>SessionInvalidate</filter-name>
<url-pattern>/system/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SessionInvalidate</filter-name>
<url-pattern>/siteEquapment/*</url-pattern>
</filter-mapping>
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助