zoukankan      html  css  js  c++  java
  • 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()
    {
    
    }
    } 
    

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

  • 相关阅读:
    es6 学习小计
    aligin-items与aligin-content的区别
    编写Shader时的一些性能考虑
    Shader预处理宏、内置状态变量、多版本编译等
    Unity内置的shader include files
    Vertex and Fragment Shader
    对于资源上MissingScript的清理方案讨论
    Surface Shader
    LOD设置
    《蛙》
  • 原文地址:https://www.cnblogs.com/A0926/p/5529661.html
Copyright © 2011-2022 走看看