关于Servlet中filter过滤器的小问题

刚进入filter的学习,一开始认为这东西也就不过如此了。

但是,我必须得承认,我错了!

刚开始学的时候,老师让我们自己做一个小程序。

就是:输入一串字符,点击发送,在另一个窗口显示。要求是把字符串中的 ‘a‘ 字符转换成 ‘*‘ 输出、例子:“string”——》"*tring"。

我一想,很简单嘛。过一会就写出来了。

但是,就在运行的时候,出了问题。输入一串字符,他并没有立刻转换出来。要后退,再进入才能转换。这就是说,我这一次输入"string"它并不会立刻转换。我需要后退一步,在进入,才会转换成"*tring"。

问题很简单。就是在用户输入后,要跳转到另一个页面。过程是:1. 进入"web.xml"这个文件,其中有filter过滤器。2. 进入过滤器,查找是否有值,(答案是没有的因为这个时候我并没有将用户输入的值写入到session或者application中。)有值的话判断值中是否包含‘a‘,有则替换为‘*‘。3. 然后进入显示值处理的Servlet类,这里将用户数据处理,并存入session或者application中。4. 然后再跳转到显示页面。

从这个流程就可以看出问题了。第二步,没有值,所以没办法进行过滤。但是当循环一次后,到第二步这里,它就有值了,过滤器生效了。但是,这里过滤的字符串是上一次输入的。

所以我们需要在第二步的时候将用户输入的值取到。因此我尝试了使用request方法,将用户输入的值取出。

我在之前认为这是行不通的,因为request传值只能在下一个页面进行接收,但是,没想到在filter中也能通过new出request对象的方式进行操作。

下面上代码:

Filter

package servlet;

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 javax.servlet.http.HttpSession;

public class T implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain nextPage ) throws IOException, ServletException {
        /* 取得所需要的内置对象*/
        // request
        HttpServletRequest request = (HttpServletRequest)req;

        // session
        HttpSession session = request.getSession();
        /**
         * 尝试直接拿到用户输入的值
         */
        String yh = req.getParameter("ping");                

        String a = null;

        if(yh!=null){
            if(yh.indexOf(‘a‘)>=0){
                a = yh.replace(‘a‘, ‘*‘);
            }
        }
        session.setAttribute("a", a);    

        nextPage.doFilter(req, resp);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

Servlet

package servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;

public class P extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse resp){
        this.doPost(req, resp);
    }
    public void doPost(HttpServletRequest req, HttpServletResponse resp){

        try {
            HttpSession session = req.getSession();
            session.getAttribute("a");
            req.getRequestDispatcher("/page/3.jsp").forward(req, resp);

        } catch (ServletException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
时间: 2024-10-13 18:11:10

关于Servlet中filter过滤器的小问题的相关文章

Java中Filter过滤器的使用

过滤器过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改.判断等,把不符合规则的请求在中途拦截或修改.也可以对响应进行过滤,拦截或修改响应.如下图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤.过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端.当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉.过滤

Servlet中的过滤器Filter详解

转自: http://blog.csdn.net/sd0902/article/details/8395641 web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链. 优点:过滤

servlet中Filter的使用

这是我自己编写JSP页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); S

java web中filter过滤器的使用

编写filter过滤器有两种方法,一种是使用注解配置,另一种是使用web.xml配置,此处使用web.xml配置来实现过滤器 (1)使用web.xml配置过程 <filter> <filter-name>setCharacterFilter</filter-name> <filter-class>com.qst.setCharacterEncodingFilter</filter-class> </filter> <filter

Servlet的尾(yi)巴---filter ( 过滤器 )的小应用

该,该,该.......,继之前说到的 Filter 现在用这个来做一个小小的应用---------->  铛,铛,铛,铛.....  ->_->      <丑逼的留言板> 要求:  ----------没错,就是这样丑逼:                                  然后就是一个代码:(JSP部分)          web.xml 文件部分              Servlet  类:          Filter 类:     1 pack

Servlet之Filter过滤器

过滤器是一个实现了javax.servlet.Filter 接口的 Java 类.javax.servlet.Filter 接口定义了三个方法: 1    public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法在每次一个请求/响应对因客户端在链的末端请求资源而通过链传递时由容器调用. 2    public void init(FilterConfig filterConfig) 该方法由 Web 容器调用,

web.xml中Filter过滤器标签说明

原文:http://www.cnblogs.com/edwardlauxh/archive/2010/03/11/1918618.html 在研究liferay框架中看到Web.xml中加入了过滤器的标签,可以根据页面提交的URL地址进行过滤,发现有几个新标签没用过,下面就介绍以下几个过滤器的标签用法: <!-- 定义Filter --> <filter> <!-- Filter的名字 --> <filter-name>log</filter-name

Web.xml中Filter过滤器标签几个说明

在研究liferay框架中看到Web.xml中加入了过滤器的标签,可以根据页面提交的URL地址进行过滤,发现有几个新标签没用过,下面就介绍以下几个过滤器的标签用法: <!-- 定义Filter --> <filter> <!-- Filter的名字 --> <filter-name>log</filter-name> <!-- Filter的实现类 --> <filter-class>lee.LogFilter</f

yii框架中关于控制器中filter过滤器和外部action的使用

在yii框架中,控制器的过滤器分为执行前和执行后,这里举例是在执行控制器前的过滤. 需要在components/文件夹下定义公共的TestAction.php文件,并且实现run()方法.这个action是各个控制器公用的. class TestController extends Controller { /** * 定义外部的action * @return array */ public function actions() { return array( 'testa' => array