`

Javaweb之Filter案例练习-项目全局编码过滤器

 
阅读更多

Filter全局编码过滤器

这篇来做一个Filter在全局编码过滤器练习,这篇新建一个web项目来做练习。

 

web项目创建

先创建一个叫GlobalFilter的web动态项目,把前面文章出现过的login.jsp复制过来,改成如下代码。

<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

    <form action="${pageContext.request.contextPath}/web/loginServlet" method="post">

        用户名:<input type="text" name="username" /><br/>

        <input type="submit" value="登录" /><br/>

    </form>

</body>

</html>

因为我们这里做全局编码的练习,到时候登录页面输入用户名,我们会采用中文字符输入。

Servlet创建

因为这里我们是模拟全局,实际中应该有许多servlet和许多前端页面,例如注册,登录,首页搜索等。我们就来创建一个servlet来模拟下就好。创建一个LoginServlet.java url-pattern是/web/loginServlet

package com.kaigejava.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet("/loginServlet")

public class LoginServlet extends HttpServlet {    

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //request.setCharacterEncoding("UTF-8");

        String name = request.getParameter("username");

        System.out.println(name);

    }    

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);

    }

 

}

以前,我们是通过这个红圈代码来设置编码,这样拿到中文的username就不会是乱码。

 

现实开发中有很多个servlet,如果都这样写这行代码来设置编码,这行代码就冗余,我们可以把这行代码放到Filter过滤器中去。

Filter类创建

创建一个MyFilter.java 实现Filter接口,代码如下。

package com.kaigejava.web.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.annotation.WebFilter;

import javax.servlet.http.HttpServletRequest;

public class MyFilter implements Filter {

    public void destroy() {

        // TODO Auto-generated method stub

    }    

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        // 转换对象

        HttpServletRequest req = (HttpServletRequest) request;

        // 设置编码

        req.setCharacterEncoding("UTF-8");

        // 放行

        chain.doFilter(request, response);

    }

 

    public void init(FilterConfig fConfig) throws ServletException {

        // TODO Auto-generated method stub

    }

}

 

web.xml内容如下

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

 <display-name>GlobalFilter</display-name>

 <welcome-file-list>

   <welcome-file>index.html</welcome-file>

   <welcome-file>index.htm</welcome-file>

   <welcome-file>index.jsp</welcome-file>

   <welcome-file>default.html</welcome-file>

   <welcome-file>default.htm</welcome-file>

   <welcome-file>default.jsp</welcome-file>

 </welcome-file-list>

 

 <filter>

     <filter-name>MyFilter</filter-name>

     <filter-class>com.kaigejava.web.filter.MyFilter</filter-class>

 </filter>

 

 <filter-mapping>

     <filter-name>MyFilter</filter-name>

     <url-pattern>/*</url-pattern>

 </filter-mapping>

 

 <servlet>

   <servlet-name>LoginServlet</servlet-name>

   <servlet-class>com.anthony.web.servlet.LoginServlet</servlet-class>

 </servlet>

 <servlet-mapping>

   <servlet-name>LoginServlet</servlet-name>

   <url-pattern>/web/loginServlet</url-pattern>

 </servlet-mapping>

 

</web-app>

 

部署测试

现在部署到tomcat然后测试以下,前台页面用户名输入框输入“张三”看看。

在Eclipse控制台可以看到“张三”打印出来不乱码,说明我们Filter中编码设置起效果了。

 

Get方式提交表单问题

login.jsp中我们表单提交是post方法,如果改成get呢,会出问题。

重新部署,再来测试下

如果是get方式传过来,中文就很有可能显示乱码。这个问题怎么解决了,有两种方式解决,第一种不要写get,就是post表单提交。现在我们来看看第二种方式如何解决。在MyFilter类中写一个通用的方法,既能解决get也能解决post的编码问题。

 

装饰模式解决get和post编码问题

我们在MyFilter.java代码中添加一个MyRequest class,里面写我们的装饰器代码,只重写了getParameter(String text)方法。

package com.kaigejava.web.filter;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

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.HttpServletRequestWrapper;

public class MyFilter implements Filter {

    public void destroy() {

        // TODO Auto-generated method stub

    }    

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        // 转换对象

        HttpServletRequest req = (HttpServletRequest) request;

        // 设置编码

        //req.setCharacterEncoding("UTF-8");

        // 放行

        req = new MyRequest(req);

        // req这个对象是包装之后的对象,把这个传到servlet中的request

        chain.doFilter(req, response);

    }

 

    public void init(FilterConfig fConfig) throws ServletException {

        // TODO Auto-generated method stub

    }

}

 

/**

*  继承HttpServlet的包装类,实现装饰模式,解决getpost乱码问题

*

*/

class MyRequest extends HttpServletRequestWrapper{    

    HttpServletRequest request;    

    public MyRequest(HttpServletRequest request) {

        super(request);

        this.request = request;

    }    

    public String getParameter(String name) {

        name = request.getParameter(name); //乱码

        try {

            return new String(name.getBytes("iso-8859-1"), "UTF-8");

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }

        return null;

    }

    }

 

 

部署到tomcatlogin.jsp表单还是get提交,测试可以解决get和post乱码。

重写其他方法

在request对象中,还有其他方法,例如getParameters() getParameterMap(),这里我们把这两个方法都重写一下。

package com.kaigejava.web.filter;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.Map;

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.HttpServletRequestWrapper;

public class MyFilter implements Filter {

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        // 转换对象

        HttpServletRequest req = (HttpServletRequest) request;

        // 放行

        req = new MyRequest(req);

        // req变成自己包装的对象,然后传递给servlet中,servlet中的request就是调用包装过的req

        chain.doFilter(req, response);

    }

    public void init(FilterConfig fConfig) throws ServletException {

    }

}

 

/**

* 继承HttpServlet的包装类,实现装饰模式,解决getpost乱码问题

*

*/

class MyRequest extends HttpServletRequestWrapper {

        HttpServletRequest request;

        public MyRequest(HttpServletRequest request) {

        super(request);

        this.request = request;

    }

    

    /*@Override

    public String getParameter(String name) {

        name = request.getParameter(name); //乱码

        try {

            return new String(name.getBytes("iso-8859-1"), "UTF-8");

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }

        return null;

    }*/

    

    @Override

    public String getParameter(String name) {

        Map<String, String[]> map = getParameterMap();

        return map.get(name)[0];

    }

    

    @Override

    public String[] getParameterValues(String name) {

        Map<String, String[]> map = getParameterMap();

        return map.get(name);

    }

    

    public boolean flag = true;

    @Override

    public Map<String, String[]> getParameterMap() {

 

        Map<String, String[]> map = request.getParameterMap(); // 乱码

        if (flag) {

 

            for (Map.Entry<String, String[]> m : map.entrySet()) {

                String[] values = m.getValue();

                for (int i = 0; i < values.length; i++) {

                    try {

                        values[i] = new String(values[i].getBytes("iso-8859-1"), "UTF-8");

                    } catch (UnsupportedEncodingException e) {

                        e.printStackTrace();

                    }

                }

            }

            flag = false;

        }

        return map;

    }

}

 

由于最后三个方法,我们倒数第二个第三个都是调用倒数第一个,为了解决第一个调用乱码好了,第二个再次调用又变成乱码,所以这里在第三个方法添加了一个flag

 

分享到:
评论

相关推荐

    java web整合开发王者归来光盘代码-第六章 过滤器

    在Java Web开发中,过滤器(Filter)是一个关键组件,它允许开发者在请求到达目标Servlet或JSP之前对其进行处理,并在响应返回给客户端之后进行后处理。本章节"过滤器"的内容聚焦于如何利用过滤器增强应用的功能和...

    JavaWeb练习2.zip

    4. **Filter**:过滤器在JavaWeb中扮演着预处理和后处理请求的角色,可以拦截和修改请求或响应。在练习中,可能需要实现Filter接口,设置过滤链,并配置web.xml来控制过滤器的执行顺序和范围。 5. **Listener**:...

    javaWeb练习题.docx

    - 过滤器是JavaWeb中用于拦截请求和响应的组件,它遵循过滤器链模式,多个过滤器可以串联起来形成过滤器链,每个过滤器按顺序执行`doFilter()`方法。 3. **Http响应**: - 重定向是HTTP响应的一种方式,通过设置...

    JavaWeb开发实战宝典-servlet篇

    8. **异常处理**:通过`@WebFilter`和`@WebListener`注解,可以创建过滤器和监听器,它们是Servlet应用的重要组件,能够实现全局的日志记录、安全检查等功能。 文件名列表中的"db_database04.sql"可能包含了与...

    javaWeb实战开发1200例第1册-14章

    6. **过滤器(Filter)**:过滤器是JavaWeb中一种强大的机制,可以在请求到达Servlet之前或之后执行预处理和后处理。章节会涵盖Filter的配置、链式过滤和常见应用场景,如字符编码转换、安全过滤等。 7. **异常处理...

    Javaweb 图书书城(不太完善)

    5. **Filter和Listener**:Filter(过滤器)和Listener(监听器)是JavaWeb中的重要组件,可以实现全局的功能,比如权限控制、字符编码转换、日志记录等。在图书书城中,Filter可能用于对用户请求进行预处理,如验证...

    学习javaweb的学习过程

    通过`&lt;filter&gt;`和`&lt;filter-mapping&gt;`元素配置过滤器及其处理范围。 - **加载顺序**:web.xml中的配置加载顺序决定了Servlet、过滤器等组件的初始化顺序。 通过以上内容的学习,你可以系统地掌握JavaWeb开发的基础...

    postmanst-JavaWeb-ma开发笔记

    8. **Filter和Listener**:过滤器和监听器,扩展和增强Web应用程序的功能。 在实践中,你需要学习如何配置Tomcat服务器,编写Servlet来处理请求,使用JSP展示结果,以及如何通过Postman测试这些接口,确保它们正常...

    30天学通java web项目案例开发

    10. **过滤器和监听器**:CHAP06可能涉及到过滤器(Filter)和监听器(Listener)的概念,它们可以用来拦截请求、修改响应,或监听应用中的特定事件。 以上是根据提供的文件名和课程主题推测的知识点概览。通过学习...

    javaweb典型模块与项目实战大全二三四个模块

    8. **过滤器(Filter)和监听器(Listener)**:这两者是JavaWeb中的重要组件,可以拦截请求、响应,实现全局的功能,如字符编码转换、登录检查、日志记录等。 9. **Ajax异步通信**:利用XMLHttpRequest对象进行...

    java过滤器对所有参数去除前后空格

    对项目中的所有参数去除前后空格...可以基于此过滤器实现过滤跨站脚本攻击,参数的增加,修改!敏感词汇过滤。实现原理为重写HttpServletRequestWrapper,获取参数的方法。include和 Forwarded 内部转发不在过滤之内。

    30天学通javaweb

    7. **过滤器(Filter)与监听器(Listener)**:这两者是JavaWeb中的重要组件,可以实现全局的功能,如登录检查、字符编码转换、会话管理等。 8. **Tomcat服务器**:作为最常用的JavaWeb服务器,读者会学会如何安装...

    javaweb乱码问题分析与解决.md

    - 定义一个过滤器(Filter)来统一设置所有请求的字符编码。这种方式更为高效且易于管理。示例代码如下: ```java public class EncodingFilter implements Filter { @Override public void doFilter...

    javaweb.基础知识课件

    web.xml是JavaWeb应用的配置文件,用于配置Servlet、过滤器、监听器以及应用的全局设置。熟练掌握web.xml的编写能提高应用的灵活性和可维护性。 9. **Servlet容器(如Tomcat)**: Tomcat是常见的Servlet容器,...

    javaweb课设-学生公寓管理系统

    在web.xml配置文件中,开发者会配置Servlet和过滤器(Filter)。Servlet配置包括URL映射,以确定哪些请求由哪个Servlet处理。过滤器则可以在请求到达目标Servlet之前或之后进行拦截,实现如权限验证、字符编码转换...

    《javaweb 入门经典》王国辉源码2-13.rar

    7. **第9章**:这章可能讲解了过滤器(Filter)和监听器(Listener)的概念,它们是JavaWeb中的重要组件,用于拦截请求、响应,实现全局的功能,比如权限验证、字符编码转换等。 8. **第10章**:这一章可能涉及到了...

    李兴华-MLDN魔乐JAVAWEB课堂

    7. **过滤器与监听器**:过滤器(Filter)和监听器(Listener)是JavaWeb中的重要组件,可以实现全局的功能,如登录验证、字符编码转换等。学习如何编写和配置它们对于提升应用功能至关重要。 8. **Spring框架**:...

    javaWeb开发资源

    6. **过滤器(Filter)**: JavaWeb开发中,Filter可以拦截请求和响应,进行预处理或后处理,如登录验证、字符编码转换等。通过`&lt;filter&gt;`和`&lt;filter-mapping&gt;`元素在`web.xml`中配置。 7. **会话管理**: ...

    方立勋 javaweb 源码

    6. **过滤器和监听器**:如何利用Filter截取请求和响应,以及Listener监听应用中的特定事件,例如Session监听、Request监听等。 7. **错误与异常处理**:自定义错误页面,以及如何使用try-catch-finally语句块和...

    中文乱码javaWEB开发各种解决中文乱码问题

    使用过滤器(Filter)可以全局地对所有请求进行编码转换,是一种更高效且统一的解决方案。在Web应用的`web.xml`文件中配置过滤器,如下所示: ```xml &lt;filter&gt; &lt;filter-name&gt;SetCharacterEncoding&lt;/filter-name&gt; ...

Global site tag (gtag.js) - Google Analytics