servlet和jsp页面过滤器Filter的作用及配置

刚刚有个朋友问我,Servlet的过滤器有什么作用?
现在发个帖子说明一下,
       
   过滤器是一个对象,可以传输请求或修改响应。它可以在请求到达Servlet/JSP之前对其进行预处理,而且能够在响应离开Servlet
/JSP之后对其进行后处理。所以如果你有几个Servlet/JSP需要执行同样的数据转换或页面处理的话,你就可以写一个过滤器类,然后在部署描述文
件(web.xml)中把该过滤器与对应的Servlet/JSP联系起来。你可以一个过滤器以作用于一个或一组servlet,零个或多个过滤器能过滤
一个或多个servlet。
         一个过滤器实现java.servlet.Filter接口并定义它的三个方法:
    1. void init(FilterConfig config) throws ServletException:在过滤器执行service前被调用,以设置过滤器的配置对象。
    2. void destroy();在过滤器执行service后被调用。
    3. Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;
       可能这么说,大家还是不太理解。举个例子来说,面向对象语言的特征里有个接口的概念,一个类实现该接口,就必须要实现接口的所有方法。那么如果我写了一个类,实现这个接口又不想实现所有方法,怎么办呢?
      写个抽象类,实现这个接口的所有方法,然后我写的类继承这个抽象类。就可以不用实现所有方法了。看到这里大家都懂了过滤器是干什么的吧
      
      既然懂了,那就直接上代码说明一下怎么配置的。

开发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()
{

}
} 
在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中。

 开发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()
{
}
}
在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()
{

}
}

注:版权所有,未经本人同意不得转载

时间: 2024-12-22 12:55:57

servlet和jsp页面过滤器Filter的作用及配置的相关文章

在servlet转向jsp页面的路径问题

requestDispatcher 对象可以有两中方式获得1.通过request对象的getRequestDispatcher方法获得2.通过ServletContext的getRequestDispatcher方法获得,但是这个方法获得的requestDispatcher 对象中的path必须以“/”开头,代表应用程序根目录,而第一中方法获得的requestDispatcher 对象则没有这种限制 不管是那种方式获得的,只要以"/"开头就代表应用程序根目录.你的问题出在jsp页面中链

Java过滤器Filter的原理及配置_学习笔记

Filter中文意思为过滤器.顾名思义,过滤器可在浏览器以及目标资源之间起到一个过滤的作用.例如:水净化器,可以看成是生活中的一个过滤器,他可以将污水中的杂质过滤,从而使进入的污水变成净水. 对于WEB应用来说,过滤器是一个驻留在服务器中的WEB组件,他可以截取客户端和WEB资源之间的请求和响应信息. WEB资源可能包括Servlet.JSP.HTML页面等 创建一个新的Filter文件 配置web.xml文件.Filter的配置和Servlet的配置很像,但是Filter的<url-patte

java过滤器——filter的使用和配置

在做DRP的过程中用到了filter.前几天昌哥和欢姐在小会议室向我们介绍了AOP的思想,用到filter时觉得它们两者特别相似. 如下图: 在我们正常的编程中,每一条线,都是从上到下依次调用,而filter是在每一个完整的调用中横着"切了一刀".通过配置,它可以对任意代码路径进行过滤. 这里就以转码/设置字符集为例,简单了解一下如何使用filter. 建立Filter CharsetEncodingFilter.java package com.drp.filter; import

JavaWeb-19 (JDBC之过滤器Filter)

JavaWeb-19 JDBC之过滤器Filter 一.Filter过滤器概述 Filter(过滤器):Web三大组件之一,就是对目标资源进行请求前或请求后. Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 实际中:过滤器就相

JSP页面编码问题

1 <%@ page language="java" contentType="text/html; charset=gb2312" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&

JSP内置对象及作用

JSP共有以下9个内置的对象: request 用户端请求,此请求会包含来自GET/POST请求的参数 response 网页传回用户端的回应 pageContext 网页的属性是在这里管理 session 与请求有关的会话期 application servlet 正在执行的内容 out 用来传送回应的输出 config servlet的构架部件 page JSP网页本身 exception 针对错误网页,未捕捉的例外 request表示HttpServletRequest对象.它包含了有关浏

图解 servlet 与jsp的关系

Servlet是Java提供的用于开发Web服务器应用程序的一个组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容.Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类. 如图所示,Java提供一系列接口类(所谓接口类就是类中所有方法只提供方法声明,不提供任何的方法实现,这些类的实现就留给后继者去做.):Servlet.ServletConfig.Serializable,然后通过多重继承产生一个最通用的Servlet

Servlet与JSP的关系

Servlet是Java提供的用于开发Web服务器应用程序的一个组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容.Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类. 如图所示,Java提供一系列接口类(所谓接口类就是类中所有方法只提供方法声明,不提供任何的方法实现,这些类的实现就留给后继者去做.):Servlet.ServletConfig.Serializable,然后通过多重继承产生一个最通用的Servlet

JSP页面跳转编码设置(Tomcat服务器)

在做JSP系统时经常遇到的就是编码问题 而这个服务器可以是Tomcat.Weblogic,Tomcat服务器默认的编码为iso-8859-1,Weblogic默认的编码为UTF-8,所以程序运行时要注意编码设置 现在我们以一个jsp页面的代码,解释这些编码设置pageEncoding="UTF-8"说的是页面的编码,比如标题栏<title>还有其它内容等等 <meta http-equiv="Content-Type" content="