servlet3.0注解/Filter案例字符乱码过滤器--(11补))

Filter案例-字符乱码过滤器

一.Servlet3.0 注解

在 Servlet3.0 之前一直使用的都是配置文件的方式来实现各种组件,
Servlet3.0
之后提供了注解,可以达到零配置。但现实中一般是注解+配置结合使用。我们看几个常用的注解。

**1. @WebServlet
**开发 servlet 项目,使用@WebServlet 将一个继承于
javax.servlet.http.HttpServlet 的类定义为 Servlet 组件。在 Servlet3.0 中
, 可以
使用@WebServlet 注解将一个继承于 javax.servlet.http.HttpServlet
的类标注为可
以处理用户请求的 Servlet。
用注解配置 Servlet

image.png

也可以配置多个 urlPatterns 来指定多个访问路径

image.png

2. @WebFilter

**
**@WebFilter 用来配置过滤器

使用注解时:过滤器链按照类名的字母排序(大部分情况)

image.png

3. @WebListener

**
**Servlet3.0 提供@WebListener 注解将一个实现了特定监听器接口的类定义
为监听器。将 实现了 ServletContextListener 接口的
MyServletContextListener
标注为监听器。
4. @MultipartConfig

**
**使用注解@MultipartConfig 将一个 Servlet 标识为支持文件上传。
Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part
对上传\的文件进行操作。

servlet3.0注解/Filter案例字符乱码过滤器--(11补))_第1张图片
image.png

二.Filter实现字符乱码过滤器(工具类)

image.png
servlet3.0注解/Filter案例字符乱码过滤器--(11补))_第2张图片
image.png

1.前台登录测试页面





用户登录


    
姓名:

2.测试登录服务器

package com.shsxt.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("/Servlet01")
public class Servlet01 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
     */
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("servlet01启动中....");
        
        String name = request.getParameter("uname");
        // 获取参数
        System.out.println(request.getParameter("uname"));
    
        
    }

}

**3.字符乱码过滤器页面

package com.shsxt.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;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

/**
 * 请求乱码问题
 *      
 *              Tomcat8及以上版本                                  Tomcat7及以下版本
 *  POST请求      会乱码,request.setCharacterEncoding("UTF-8");      会乱码,request.setCharacterEncoding("UTF-8");  
 *              
 *  GET请求       不会乱码,不处理                                        会乱码,new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
 */
@WebFilter("/*")
public class EncodeFilter implements Filter {

  
    public EncodeFilter() {
        
    }

    
    public void destroy() {
    }

    
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
        
        // 基于HTTP
        HttpServletRequest request = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;
        
        // 处理POST请求乱码 (无论什么版本服务器)
        request.setCharacterEncoding("UTF-8");
        
        // 处理GET请求乱码
        // 1、得到请求类型
        String method = request.getMethod();
        // 2、判断是否是GET请求
        if ("GET".equalsIgnoreCase(method)) {
            // 3、如果是GET请求,则获取服务器版本信息
            String serverInfo = request.getServletContext().getServerInfo();
            //System.out.println(serverInfo);
            // 4、得到服务器的版本号
            String versionStr = serverInfo.substring(serverInfo.lastIndexOf("/")+1,serverInfo.lastIndexOf("/")+2);
            // 5、判断是否是Tomcat8以下版本服务器
            if (Integer.parseInt(versionStr) < 8) {
                // new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
                // 定义类,继承HttpServletRequestWrapper封装类,重写getParameter()方法,返回的类的本质是request对象
                HttpServletRequest req = new MyWapper(request);
                // 放行指定request对象  (Ttomcat7及以下版本的GET请求)
                chain.doFilter(req, response);
                return;
            }
        }
        
        // POST请求和Ttomcat8及以上版本的GET请求放行
        chain.doFilter(request, response);
    }
    


    public void init(FilterConfig fConfig) throws ServletException {
        
    }

}

/**
 * 1、定义类
 * 2、继承HttpServletRequestWrapper封装类
 * 3、重写getParameter()方法
 * 
 * @author Lisa Li
 *
 */
class MyWapper extends HttpServletRequestWrapper {
    
    // 定义属性。提升作用域
    private HttpServletRequest request;

    /**
     * 带参构造器
     * @param request
     */
    public MyWapper(HttpServletRequest request) {
        super(request);
        this.request = request;
    }

    /**
     * 重写getParameter()方法,处理乱码问题
     */
    @Override
    public String getParameter(String name) { // name代表的是前台传递的参数名,即键
        
        // 获取参数的值
        String value = request.getParameter(name);
        
        // 判断值是否为空,不为空处理乱码问题
        if (value == null || "".equals(value.trim())) {
            return value;
        }
        try {
            // 处理乱码问题
            value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return value;
    }
    
    
}


你可能感兴趣的:(servlet3.0注解/Filter案例字符乱码过滤器--(11补)))