`

J2EE中 过滤器应用

    博客分类:
  • J2EE
阅读更多
一 页面编码过滤器
1.开发EncodingFilter.java文件,继承自
javax.servlet.Filter:
package bluemoon.crm.systemmanage.struts.Filter;

import java.io.*; 
import javax.servlet.*;

public class EncodingFilter implements Filter 
{ 
protected String encoding = null; 
protected FilterConfig config; 

public void init(FilterConfig filterConfig) throws ServletException 
{ 
this.config = filterConfig; 
//从web.xml配置文件中获取编码配置 
this.encoding = filterConfig.getInitParameter("Encoding"); 
} 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
{ 
if(request.getCharacterEncoding() == null) 
{ 
String encode = getEncoding(); 
if(encode != null) 
{ 
//设置request的编码方式 
request.setCharacterEncoding(encode); 
} 
} 
chain.doFilter(request,response); 
} 
public String getEncoding() 
{ 
return encoding; 
} 
public void destroy() 
{ 

} 
} 
2. 在web.xml文件中加入如下配置信息:
<!-- 页面请求编码过滤器 注意每个页面的pageEncoding="GB2312" -->
<filter> 
<filter-name>encodingFilter</filter-name> 
<filter-class>bluemoon.crm.systemmanage.struts.Filter.EncodingFilter</filter-class> 
<init-param> 
<param-name>Encoding</param-name> 
<param-value>GB2312</param-value> 
</init-param> 
</filter> 
<filter-mapping> 
<filter-name>encodingFilter</filter-name> 
<!-- 对全部的jsp页面有效,比较郁闷的是没有太多的配置方式 -->
<url-pattern>/*</url-pattern> 
</filter-mapping> 

<!--页面请求编码过滤器结束-->
二.用户是否登陆过滤器:
1.首先增加一个Action、ActionForm & JSP:
login.jsp中为一个登陆表单:
UserActionForm.java为一个Struts的ActionForm。
UserAction.java将用户登陆信息添加到session中。
2. 开发UserLoginedFilter.java:
package bluemoon.crm.systemmanage.struts.Filter;

import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.*;

import bluemoon.crm.systemmanage.struts.forms.UserActionForm;

public class UserLoginedFilter extends HttpServlet implements Filter 
{ 
protected FilterConfig config; 

public void init(FilterConfig filterConfig) throws ServletException 
{ 
this.config = filterConfig; 
} 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
{ 
RequestDispatcher dispatcher = request.getRequestDispatcher("userLogin.jsp"); 
HttpServletRequest userRequest = (HttpServletRequest)request; 
UserActionForm userActionForm = (UserActionForm)userRequest.getSession().getAttribute("userActionForm"); 
if(userActionForm == null || userActionForm.getUser_name() == null || userActionForm.getUser_name().trim().length()<1) 
{ 
System.out.println("用户未登录!"); 
dispatcher.forward(request,response); 
return; 
} 
System.out.println("用户已登录!"); 
chain.doFilter(request,response); 
} 
public void destroy() 
{ 

} 
} 

3.在web.xml文件中添加如下配置信息:
<!—用户是否登陆过滤器配置 注意只过虑jsp页面,不过虑.do -->
<filter> 
<filter-name>userLoginedFilter</filter-name> 
<filter-class>bluemoon.crm.systemmanage.struts.Filter.UserLoginedFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>userLoginedFilter</filter-name> 
<url-pattern>*.jsp</url-pattern> 
</filter-mapping> 
<!—用户是否登陆过滤器配置结束 -->
三.用户是否登陆过滤器在多模块中的应用:
1.修改上面的过滤器代码:
package bluemoon.crm.systemmanage.filter;

import java.io.IOException;

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.*;

import bluemoon.crm.systemmanage.struts.forms.UserForm;

//用户未登陆过滤器 
public class UserNoLoginedFilter extends HttpServlet implements Filter 
{

protected FilterConfig config; 

public void init(FilterConfig filterConfig) throws ServletException 
{ 
this.config = filterConfig; 
} 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
{ 
//首先预定义到要转向的页面,由此带来的问题就是userLogin.jsp页面的图片必须要使用绝对路径,方法见userLogin.jsp页面 
RequestDispatcher dispatcher = request.getRequestDispatcher("/toLogin.do?prefix=&page=/userLogin.jsp"); 
//注意在struts-config.xml中增加一个Action,如下: 
/* 
*<action 
* attribute="userForm" 
* name="userForm" 
* path="/toLogin" 
* scope="request" 
* type="org.apache.struts.actions.SwitchAction" /> 
*/ 
// 从session中获取用户form 
HttpServletRequest userRequest = (HttpServletRequest)request; 
UserForm userForm = (UserForm)userRequest.getSession().getAttribute("userForm"); 

//如果未登陆则没有userFrom信息 
if(userForm == null || userForm.getUser_name() == null || userForm.getUser_name().trim().length()<1) 
{ 
System.out.println("用户未登录!"); 

//分发到登陆页面 
dispatcher.forward(request,response); 
//((HttpServletResponse)response).sendRedirect("toModule.do?prefix=&page=/userLogin.jsp"); 
return; 
} 


System.out.println("用户"+userForm.getUser_name()+"已登录!"); 
chain.doFilter(request,response); 
} 
public void destroy() 
{ 

} 
}

四.关闭Session过滤器
1.相关的HibernateUtil.java源码:
package com.worklog.util;

import org.hibernate.*; 
import org.hibernate.cfg.*;

public class HibernateUtil { 

private static SessionFactory sessionFactory; 
static 
{ 
try 
{ 
sessionFactory = new Configuration().configure().buildSessionFactory(); 
} 
catch(Exception e) 
{ 
e.printStackTrace(); 
} 
} 

public static final ThreadLocal<Session> threadLocalSession = new ThreadLocal<Session>(); 
public static final ThreadLocal<Transaction> threadLocalTransaction = new ThreadLocal<Transaction>(); 
public static Session currentSession() 
{ 
Session session = threadLocalSession.get(); 
try 
{ 
if(session == null || !session.isOpen()) 
{ 
session = openSession(); 
threadLocalSession.set(session); 
} 
} 
catch(Exception e) 
{ 
e.printStackTrace(); 
System.out.println("获取Session失败"); 
} 
return session; 
} 
public static Session openSession() throws Exception 
{ 
return getSessionFactory().openSession(); 
} 
public static SessionFactory getSessionFactory() throws Exception 
{ 
return sessionFactory; 
} 
public static void closeSession() 
{ 
Session session = (Session)threadLocalSession.get(); 
threadLocalSession.set(null); 
try 
{ 
if(session != null && session.isOpen()) 
{ 
//System.out.println("HibernateUtil.java--line59,关闭Session!"); 
session.close(); 
} 
} 
catch(Exception e) 
{ 
e.printStackTrace(); 
System.out.println("关闭Session失败"); 
} 
} 
public static void beginTransaction() 
{ 
Transaction tx = (Transaction)threadLocalTransaction.get(); 
try 
{ 
if(tx == null) 
{ 
tx = currentSession().beginTransaction(); 
threadLocalTransaction.set(tx); 
} 
} 
catch(Exception e) 
{ 
e.printStackTrace(); 
System.out.println("开始事务失败"); 
} 
} 
public static void commitTransaction() 
{ 
Transaction tx = (Transaction)threadLocalTransaction.get(); 
try 
{ 
if(tx !=null && !tx.wasCommitted() && !tx.wasRolledBack()) 
{ 
tx.commit(); 
} 
threadLocalTransaction.set(null); 
} 
catch(Exception e) 
{ 
e.printStackTrace(); 
System.out.println("提交失败"); 
} 
} 
public static void rollbackTransaction() 
{ 
Transaction tx = (Transaction)threadLocalTransaction.get(); 
try 
{ 
threadLocalTransaction.set(null); 
if(tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) 
tx.rollback(); 
} 
catch(Exception e) 
{ 
e.printStackTrace(); 
System.out.println("回滚失败"); 
} 
} 
} 

2.CloseSessionFilter.java源码:
package com.worklog.filter;

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;

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

import com.worklog.util.HibernateUtil;

public class CloseSessionFilter implements Filter{ 
Log log = LogFactory.getLog(this.getClass()); 
protected FilterConfig config; 

public void init(FilterConfig config) throws ServletException 
{ 
this.config = config; 
} 

public void doFilter( 
ServletRequest request, 
ServletResponse response, 
FilterChain chain) 
throws IOException,ServletException 
{ 
try 
{ 
//让后面的Filter链处理请求,这个Filter仅仅拦截响应处理Hibernate操作 
chain.doFilter((HttpServletRequest)request, (HttpServletResponse)response); 
} 
finally 
{ 
try 
{ 
//一直没有合适的关闭session的方法 
HibernateUtil.closeSession(); 
//System.out.println("close session success"); 
log.debug("close session success"); 
} 
catch(Exception e) 
{ 
HibernateUtil.rollbackTransaction(); 
System.out.println("can not close session!\nerrors:"+e.getMessage()); 
log.debug("can not close session!\nerrors:"+e.getMessage()); 
} 
finally 
{ 
HibernateUtil.closeSession(); 
} 
} 
} 

public void destroy() 
{ 

} 
} 
3.web.xml配置
<?xml version="1.0" encoding="GB2312"?> 
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
<!-- 关闭Session过滤器 --> 
<filter> 
<filter-name>closeSessionFilter</filter-name> 
<filter-class>com.worklog.filter.CloseSessionFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>closeSessionFilter</filter-name> 
<servlet-name>action</servlet-name> 
</filter-mapping> 
<!-- 关闭Session过滤器结束 --> 

<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>debug</param-name> 
<param-value>3</param-value> 
</init-param> 
<init-param> 
<param-name>detail</param-name> 
<param-value>3</param-value> 
</init-param> 
<load-on-startup>0</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>action</servlet-name> 
<url-pattern>*.do</url-pattern> 
</servlet-mapping> 
</web-app>


分享到:
评论
2 楼 kaituozhe6666 2008-07-05  
1 楼 zhanwc 2008-07-04  
写的很不错嘛。。~!!~

相关推荐

    论文研究-管道、过滤器和MVC软件体系模式在J2EE中的应用.pdf

    在深入分析《论文研究-管道、过滤器和MVC软件体系模式在J2EE中的应用.pdf》这篇文章之前,需要先理解几个核心概念:软件体系构架、管道和过滤器以及MVC模式。 软件体系构架(Software Architecture)是指软件系统的...

    J2ee的过滤器代码

    在J2EE应用中,过滤器的配置是在web.xml文件中进行的。你需要指定过滤器的类名,以及它应该拦截哪些URL模式。例如: ```xml &lt;filter-name&gt;MyFilter &lt;filter-class&gt;com.example.MyFilterClass&lt;/filter-class&gt; ...

    j2ee过滤器Filter使用详解(实例)

    总的来说,J2EE过滤器Filter是构建安全、高效Web应用的关键工具。它们允许开发者在请求处理链中插入自定义逻辑,确保数据的安全性、合规性和一致性。通过合理配置和使用过滤器,开发者可以提高应用程序的功能性和可...

    J2EE之filter的应用

    //销毁过滤器48. public void destroy() {49. this.filterConfig = null;50. }51.}52.53.2、在 web.xml 文件中配置 Filter54.&lt;filter&gt;55. &lt;filter-name&gt;EncodeFilter&lt;/filter-name&gt;56. &lt;filter-class&gt;...

    Servlet过滤器机制分析及应用

    Servlet过滤器是Java Web应用程序中的一个重要组成部分,它提供了一种灵活的方式来对客户端的请求和服务器的响应进行预处理和后处理。这种机制允许开发者在不改变核心业务逻辑的情况下增强应用程序的功能。 #### 二...

    J2EE应用小程序

    7. **部署描述符**:在J2EE应用中,部署描述符(如web.xml)定义了应用的配置信息,如Servlet、过滤器、监听器的映射,以及安全和会话配置等。 8. **EJB(Enterprise JavaBeans)**:虽然描述中没有明确提及,但...

    这是J2EE练习5(exercise5)学习使用过滤器的题目,代码实现,作业报告

    在J2EE开发中,过滤器(Filter)是核心组件之一,它允许开发者在请求到达目标资源(如Servlet、JSP)之前或之后对请求和响应进行处理。本练习5(Exercise5)专注于过滤器的使用,通过代码实现和作业报告来深入理解这...

    J2ee应用中文乱码问题解决方案.doc

    - 配置`web.xml`中的`&lt;filter&gt;`和`&lt;filter-mapping&gt;`,使用`CharacterEncodingFilter`过滤器设定全局编码。 总结来说,解决J2EE应用中文乱码问题的关键在于理解字符集的原理,并在每个可能引起乱码的环节进行相应...

    J2EE 5 中文API

    Servlet 2.5规范带来了许多改进,包括更灵活的过滤器链、更强大的会话管理以及对HTTP方法的支持。这些改进使开发动态Web应用程序变得更加方便。 **7. CDI(Contexts and Dependency Injection)的前身** J2EE 5虽然...

    cas无过滤器 j2ee系统接入示例

    这个示例提供的代码工程中,关键在于`CasValidate`类,它是实现无过滤器CAS验证的核心。`CasValidate`类会模拟Filter的功能,负责与CAS服务器通信,验证用户的身份。当你导入工程到Eclipse并运行后,可以观察`main ...

    J2EE编程(Struts应用步骤)

    打开`web.xml`文件,这是Web应用的部署描述符,需要在这里声明Struts2的过滤器。在`web.xml`中添加以下内容: ```xml &lt;filter-name&gt;struts2 &lt;filter-class&gt;org.apache.struts2.dispatcher.filter....

    非常简单的J2EE购物车

    8. **过滤器和监听器**:在J2EE应用中,过滤器(Filter)可以用来拦截和修改请求或响应,监听器(Listener)用于监听特定事件,如会话的创建和销毁。这些组件可以用来实现功能,如登录验证、权限控制和会话超时提醒...

    J2EE_1.5_API中文帮助文档.chm(完全可用)

    在1.5版本中,Servlet 2.4规范引入了包括过滤器(Filter)和监听器(Listener)在内的增强功能,使开发者可以更灵活地控制请求和响应流程。 2. **JSP(JavaServer Pages)**:JSP是用于创建动态网页的Java技术。JSP...

    J2EE中文问题终极解决之道

    8. **过滤器处理**:在Servlet过滤器中设置`request.setCharacterEncoding("UTF-8")`,以确保从浏览器接收的请求被正确地转化为UTF-8。 9. **JSP与HTML声明**:在JSP页面头部声明`;charset=UTF-8"%&gt;`,以及HTML的`...

    J2EE前端应用程式架构与

    7. 一个符合Servlet 2.3规范的Web应用应包含web.xml配置文件,定义Servlet、过滤器、监听器等组件,以及URL映射规则。 8. "Forward"是服务器内部的跳转,保持请求的状态;"Redirect"是客户端的重定向,会产生新的...

    J2EE考试复习材料

    过滤器是J2EE应用程序中的一个组件,用于拦截和处理用户请求。我们可以开发一个过滤器来显示一个JSP页面的执行时间。 十二、JavaBean DatabaseBean JavaBean DatabaseBean是一个简单的JavaBean,用于连接数据库并...

    j2ee 笔记 j2ee 笔记 j2ee 笔记

    在J2EE应用中,经常需要访问后端数据库。为了提高性能和效率,通常采用连接池技术来管理数据库连接。 - **数据源(DataSource)**:提供了一种统一的方式访问不同的数据库,使应用程序不必关心具体的数据库实现细节...

    J2EE JAR包(J2EE1.3 J2EE1.4 J2EE5.0 )

    1. **Servlet 2.4规范**:进一步优化了过滤器和监听器,增强了安全性。 2. **JSP 2.0和EL 1.0**:提升了JSP的开发效率,EL可以与JSF(JavaServer Faces)结合使用。 3. **EJB 2.1**:引入了Session Bean的无状态会话...

    J2EE中文帮助文档

    在J2EE 5.0中,Servlet 2.5规范被采纳,提供了更多的生命周期方法、过滤器和监听器支持,以实现更灵活的Web应用架构。 - **JSP**:JSP是一种动态网页技术,允许开发者在HTML页面中嵌入Java代码,简化了视图层的开发...

Global site tag (gtag.js) - Google Analytics