`

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

    讨论了软件体系构架的重要性和意义,及其在项目开发中的典型应用。

    Servlet过滤器机制分析及应用

    过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中。...由于是纯Java实现,所以Servlet过滤器是跨平台的模块化和可重用性,使得它们很容易地被部署到任何相容的J2EE环境中。

    HttpIpModifier:用于从正确的 HTTP 标头读取请求 ip 的 J2EE HTTP 过滤器

    用于从正确的 HTTP 标头读取请求 ip 的 J2EE HTTP 过滤器。 它可以做什么 当你在 Nginx 或其他前端服务器后面部署你的 web 应用程序时,http 头中的 ip 值将是前端服务器的 ip 而不是客户端的 ip,这显然不是我们想...

    ASP.NET过滤器的应用方法介绍

    并执行过滤器的方法,根据实际应用情况,在过滤器中修改请求的代码、判断会话信息,也可以做权限控制,总之这个过滤器是非常有意义的,也可以说是责任链设计模式在J2EE中的一个应用。  那么在ASP.NET中是否也可以...

    j2EE的简单web开发

    对于j2EE的简单web开发,其中有各种j2EE web开发过程中会使用到的技巧,如el表达式,jstl自定义标签,过滤器的使用等 通过这些来实现登录 注册 修改 删除 分页 等功能

    J2EE应用开发_servlet

    Servlet介绍 Servlet常用的接口 Servlet的配置 Servlet过滤器 Servlet容器安全和身份验证 Servlet图像处理 Servlet应用实例——投票模块

    基于J2EE核心模式的组合Web框架研究

    核心模式( 拦截过滤器、前端控制器、服务定位器、 数据访问对象工厂策略等[ 1, 2] ) , 实现了各个层面 之间和业务层内部的松散耦合[ 3] , 使CWFBP 具 有较好的开放性和灵活性; 通过添加对AJAX 的 支持, 实现了CWFBP ...

    J2EE实验指导书*******

    1、创建web过滤器实现form表单post提交的中文乱码 32 2、配置中文乱码过滤器 32 3、创建登录验证的过滤器并配置 32 四、实验报告 32 实验十四 JSP+Servlet+JavaBean开发模式 33 一、实验目的 33 二、实验环境 33 三...

    Jprobe简明使用手册

    3、通过使用过滤器聚焦你的代码; 4、监控被收集的数据(Jprobe Coverage除外); 5、保存数据到快照文件; 6、以高级图形用户界面回顾快照文件; 7、在源代码中标识问题的方法或行; 8、把快照文件同基线进行比较...

    JSP高级应用

    JSP2.0在J2EE中高级应用,有过滤器,监听器和一些标签

    论文研究-基于Servlet Filter的访问控制过滤器插件 .pdf

    基于Servlet Filter的访问控制过滤器插件,汪克炎,龙毅宏,对于部署在互联网上的J2EE Web应用系统,用户的安全访问是至关重要的。本文介绍使用Servlet Filter技术设计一种可插入的、可扩展的、对��

    J2EE学习笔记(J2ee初学者必备手册)

    第六章 过滤器 ...234 第七章 Web Application Life Cycle Events ........................235 JSP学习笔记..................236 JSP前言.................236 第一章 Introduction to JSP...............238 第二...

    JavaWeb 开发指南 PPT课件

    14章 使用Servlet过滤器和监听器 15章 JSP Web应用的安全性 16章 Tomcat容器的JSP 17章 在JSP中使用Hibernate实现数据持久化 18章 JSP Web应用的设计与实践 19章 MVC模式实现----Struts2 20章 MVC模式实现----...

    用web.xml控制Web应用的行为

    Tomcat 10 5 初始化和预装载servlet与JSP页面 10 5.1 分配servlet初始化参数 10 5.2 分配JSP初始化参数 13 5.3 提供应用范围内的初始化参数 15 5.4 在服务器启动时装载servlet 15 6 声明过滤器 16...

    基于J2EE架构的多层次结合的权限拦截策略 (2012年)

    详细分析了J2EE架构下的基于标签的表示层、基于过滤器的控制层和基于AOP的业务逻辑层的权限拦截的原理与优势,并将这几种方法整合,设计并实现了1种多层次结合的权限拦截策略,可以有效地嵌入基于J2EE的各种应用系统,...

    Head First Servlet JSP(清晰中文版).part4

    如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的知识,以一种轻松、幽默而又形象的方式让你了解、掌握servlets和JSP,并将其运用到你的项目中去。...

    Head First Servlet JSP(清晰中文版).part2

    如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的知识,以一种轻松、幽默而又形象的方式让你了解、掌握servlets和JSP,并将其运用到你的项目中去。...

    Head First Servlet JSP(清晰中文版).part3

    如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的知识,以一种轻松、幽默而又形象的方式让你了解、掌握servlets和JSP,并将其运用到你的项目中去。...

    Head First Servlet JSP(清晰中文版).part1

    如何使用JSP表达式语言,如何部署Web应用,如何开发定制标记,以及会话状态、包装器、过滤器、企业设计模式等方面的知识,以一种轻松、幽默而又形象的方式让你了解、掌握servlets和JSP,并将其运用到你的项目中去。...

Global site tag (gtag.js) - Google Analytics