zoukankan      html  css  js  c++  java
  • Filter应用一乱码过滤处理

    Filter,Listener定义区别

    监听器和过滤器是一种特殊的servlet,其中监听器是用来处理服务器端事件,过滤器是在请求发出之后,响应到客户端之前的处理
    用户的请求到达Servlet(JSP)之前,先经过过滤器处理,服务器的响应到达客户浏览器之前,也要先经过过滤器的处理。过滤器可以有多个,形成过滤器链filter chain。

    哪些页面或者jsp需要用过滤器处理

    • 应用程序中所有的资源 /*

    • 指定的类型文件资源 *.html

    • 指定的目录下的所有文件 /folder_name/*

    • 指定的servlet myfilter.LoggerServlet

    • /simplefilter.html

    • 指定目录下指定类型的单一文件 /dir_name/index.jsp

    可以设置对何种请求方式使用过滤器

    请求方式包括(request,forward,include,exception)

     1 request
     2 href="a.jsp"
     3 response.sendRedirect("a.jsp");
     4 window.open("a.jsp");
     5 location.href="a.jsp";
     6 src="a.jsp"
     7 .........
     8 forward 页面跳转
     9 <jsp:forward ....
    10 sendForward ...
    11 
    12 include
    13 有两种include其他页面的方法,一种是指令标签<%@ include  file="xxx.jsp"%>,一种是动作标签<jsp:include  page="xxx.jsp"/>
    14 execetion
    15 ......

    应用场合

    字符编码转换,权限管理,记录访问日志,过滤敏感词

    案例:对字符编码进行过滤

    • 创建新的web工程,在根目录下创建register与welcome两个jsp页面

    • 创建三个包,分别为filter,listener,servlet等

    • 添加JQuery包到项目中

    • 创建listener,利用服务器启动创建三个用户并存放在HashMap中,并将HashMap中的信息存放在application中,代码如下:

     1 package com.wy.listener;
     2 
     3 import java.util.HashMap;
     4 import javax.servlet.ServletContextEvent;
     5 import javax.servlet.ServletContextListener;
     6 import javax.servlet.annotation.WebListener;
     7 
     8 /**
     9  * Application Lifecycle Listener implementation class FilterListener
    10  *
    11  */
    12 @WebListener
    13 public class FilterListener implements ServletContextListener {
    14 
    15     /**
    16      * Default constructor. 
    17      */
    18     public FilterListener() {
    19         // TODO Auto-generated constructor stub
    20     }
    21 
    22     /**
    23      * @see ServletContextListener#contextDestroyed(ServletContextEvent)
    24      */
    25     public void contextDestroyed(ServletContextEvent arg0)  { 
    26          // TODO Auto-generated method stub
    27     }
    28     
    29     /**
    30      * @see ServletContextListener#contextInitialized(ServletContextEvent)
    31      */
    32     public void contextInitialized(ServletContextEvent arg0)  { 
    33          // TODO Auto-generated method stub
    34         HashMap<String, String> map=new HashMap<String,String>();
    35         map.put("haha", "123456");
    36         map.put("xixi", "123456");
    37         map.put("youyou", "123456");
    38         //将信息存放在application中
    39         arg0.getServletContext().setAttribute("USERS", map);
    40     }
    41 }
    • 创建对应的register.jsp页面,并对用户名进行判定,查看看是否重复,当前输入的用户名是否可用,强制进行提交前要先检查用户名,代码如下:

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <title>注册页面</title>
     8 <script type="text/javascript" src="jslib/jquery.js"></script>
     9 <script type="text/javascript">
    10 $(function(){
    11     $("#check").click(function(){
    12         $.post("checkIt",{"username":$("[name='userName']").val()},function(data){
    13             var s=data.split("$");
    14             $("[name='status']").val(s[0]);
    15             $("#info").html(s[1]);
    16         });
    17     });
    18     $("#sub").click(function(){
    19         if($("[name='status']").val()=="0"){
    20             $("#info").html("查看用户名是否重复");
    21             return false;
    22         }
    23         if($("[name='status']").val()=="1"){
    24             $("#info").html("用户名重复,输入新的用户名来检查");
    25             $("[name='status']").val(0);
    26             return false;
    27         }
    28         return true;
    29     });
    30 });
    31 </script>
    32 </head>
    33 <body>
    34      <div id="info"></div>
    35      <form action="welcome.jsp" method="post">
    36      <input type="hidden" name="status" value="0"/>
    37      用户名:<input type="text" name="userName"/><br>
    38      密&nbsp;码:<input type="password" name="pwd"/><br>
    39      <input type="button" id="check" value="检查用户"/>
    40      <input type="submit" id="sub" value="提交"/>
    41      </form>
    42 </body>
    43 </html>
    • 创建servlet用于页面信息判断

     1 package com.wy.servlet;
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 import java.util.HashMap;
     6 import javax.servlet.ServletException;
     7 import javax.servlet.annotation.WebServlet;
     8 import javax.servlet.http.HttpServlet;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 
    12 /**
    13  * Servlet implementation class checkIt
    14  */
    15 @WebServlet("/checkIt")
    16 public class checkIt extends HttpServlet {
    17     private static final long serialVersionUID = 1L;
    18        
    19     /**
    20      * @see HttpServlet#HttpServlet()
    21      */
    22     public checkIt() {
    23         super();
    24         // TODO Auto-generated constructor stub
    25     }
    26 
    27     /**
    28      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    29      */
    30     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    31         // TODO Auto-generated method stub
    32         @SuppressWarnings("unchecked")
    33         HashMap<String, String> map=(HashMap<String, String>) 
    34                 request.getServletContext().getAttribute("USERS");
    35         String name=request.getParameter("username");
    36         PrintWriter out=response.getWriter();
    37         if(map.containsKey(name)){
    38             out.println("1$用户名已存在");
    39         }else {
    40             out.println("2$用户名可用");
    41         }
    42     }
    43 
    44     /**
    45      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    46      */
    47     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    48         // TODO Auto-generated method stub
    49         doGet(request, response);
    50     }
    51 }
    • 创建对应的welcome.jsp用于提交之后的页面跳转,并输出用户的用户名信息,代码如下:

     1 <%@page import="java.util.HashMap"%>
     2 <%@ page language="java" contentType="text/html; charset=UTF-8"
     3     pageEncoding="UTF-8"%>
     4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     5 <html>
     6 <head>
     7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     8 <title>Insert title here</title>
     9 </head>
    10 <body>
    11 <!-- 将注册成功的用户提交到HashMap中,要从application中去存取,因为在监听器中HashMap的最新信息存放在application中 -->
    12 <% 
    13     @SuppressWarnings("unchecked")
    14     HashMap<String,String> map=(HashMap<String,String>)
    15                     request.getServletContext().getAttribute("USERS");
    16     String name=request.getParameter("userName");
    17     String pwd=request.getParameter("pwd");
    18     map.put(name, pwd);
    19 %>
    20   注册成功,欢迎你:<%=name %>
    21 </body>
    22 </html>
    • 以上信息完成之后在运行过程中会出现输出提示信息乱码的问题,这个时候引入filter,只需要一个对应的filter类便能解决,编码如下:

    在不使用过滤器的情况下也可以解决乱码问题,只是需要在每一个页面去进行处理,会有大量重复的编码

     1 package com.wy.filter;
     2 
     3 import java.io.IOException;
     4 import javax.servlet.DispatcherType;
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.annotation.WebFilter;
    12 
    13 /**
    14  * Servlet Filter implementation class EncodingFilter
    15  */
    16 @WebFilter(dispatcherTypes = {
    17                 DispatcherType.REQUEST, 
    18                 DispatcherType.FORWARD, 
    19                 DispatcherType.INCLUDE, 
    20                 DispatcherType.ERROR
    21         }
    22                     , urlPatterns = { "/*" })
    23 public class EncodingFilter implements Filter {
    24 
    25     /**
    26      * Default constructor. 
    27      */
    28     public EncodingFilter() {
    29         // TODO Auto-generated constructor stub
    30     }
    31 
    32     /**
    33      * @see Filter#destroy()
    34      */
    35     public void destroy() {
    36         // TODO Auto-generated method stub
    37     }
    38 
    39     /**
    40      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
    41      */
    42     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    43         // TODO Auto-generated method stub
    44         // place your code here
    45         /**
    46          * 利用过滤器来设置提取输出编码,下面两行代码会在所有的页面中调用过滤
    47          * 设置提取编码格式(在提取数据之前)request
    48          * 设置响应输出编码格式(在输出数据之前)response
    49          */
    50         request.setCharacterEncoding("utf-8");
    51         response.setCharacterEncoding("utf-8");
    52         // pass the request along the filter chain
    53         chain.doFilter(request, response);
    54     }
    55 
    56     /**
    57      * @see Filter#init(FilterConfig)
    58      */
    59     public void init(FilterConfig fConfig) throws ServletException {
    60         // TODO Auto-generated method stub
    61     }
    62 }
  • 相关阅读:
    2014-11-24 作业
    数据库查询基本部分
    SQL备份还原,分离附加
    SQL基础2
    SQL基础,与数据类型;
    if语句解一元二次方程~
    用C语言计算圆的面积~!!!!!!!
    C语言基础
    数据导出和TreeView
    MDI窗体容器和权限设置
  • 原文地址:https://www.cnblogs.com/sinon/p/6674407.html
Copyright © 2011-2022 走看看