zoukankan      html  css  js  c++  java
  • 国际化与过滤器

    1、国际化:

    开发系统、网站、平台的页面显示的效果可以支持多个国家的语言。

    1)引用的资源的jsp页面。(没有明确的指出是用什么样的语言)

    2)体现不同语言的资源文件。 msg_zh_CN.properties

    3)Jsp页面上,使用format格式化标签库,引用资源文件<fmt:message>;

    2、Filter

    1)他是一个类,一个特殊的类,可以说是servlet的升级版本。Filter

    2)过滤或者拦截的作用,如果符合条件就放行,不符合就返回。(过滤器中写)

    3)过滤的是请求和响应。(过滤的过程是双向的)

    4)过滤器可以有多个,这样就构成了过滤器链

    如果有多个过滤器的话,过滤顺序是根据在web.xml的配置顺序决定的,先映射县过滤。

    5)定义一个过滤器:filter

    6)编码过滤器

    7)控制登录权限。

     

    国际化中,为不同的语言要添加不同的语言 库。通常用 msg代表信息,语言代号,区域代号。

    也就是msg_语言代号_区域代号.properties。实现语言的配置,从而实现国际化。

     

    先把页面做出来:

    然后在页面中:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

     

    明天讲:监听器和自定义标签

     

     

    我只是想在本页实现中英文切换。

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        <fmt:setLocale value="${ param.locale}"/>
        <fmt:setBundle basename="msg"/>
        
        <title><fmt:message key="register"/></title>
      </head>
      <body>
      <a href="register.jsp?locale=zh_CN">中文</a>
      <a href="register.jsp?locale=en_US">英文</a><br/>
          这是个假的页面,只是为了展示多语言效果
            <form action="#" >
                <fmt:message key="name"/>:<input type="text" /><br/>
                <fmt:message key="password"/>:<input type="text" /><br/>
                <fmt:message key="age"/>:<input type="text" /><br/>
                <fmt:message key="gender"/>:<input type="text" /><br/>
                <fmt:message key="address"/>:<input type="text" /><br/>
                <fmt:message key="mail"/>:<input type="text" /><br/>
                <input type="submit" value="提交"/>
            </form>
      </body>
    </html>

    但是发现了一个bug,下面的能够正常展示,但是在标题里面,就有问题

    因为fmttitle都放在一个里面,所以可能会有问题,所以解决的办法是,标题就用中文或者英文,不允许那个人他一定可以看懂的。

    有一些事情要说一下,就是在2014版本里面,是支持多语言输入的,直接进行了utf-8码的转换,但是在2013里面,就只能在properties里面一个属性一个属性的添加。

     

    另外一种方式是采用C:Program Filesjavajdk1.6.0_43in目录下的 natice2ascii.exe实现编码转换,要求是键值对的形式。把要翻译的文件给翻译,让他们写成txt在交回来,在src目录下,复制粘贴然后解决所有问题。

    当然了,txttxt properties properties 或者 像上面那样,这四种形式都是允许的。都能实现转码。再有就是 在utf-8里面,大小写,对应同一个字符。

    过滤器在进去的时候要进行一次过滤,出去的时候也要进行一次过滤。

    过滤顺序以在web.xml的配置顺序作为过滤依据,先进行映射配置的过滤器,优先进行过滤。

    这样,我们可以实现两个事儿

    1、为所有的输入内容设置编码格式。

    2、如果已经登录,那么允许访问,如果,没有登录那么返回登录界面,这样就避免了直接通过地址栏对内容进行访问而造成的数据不安全。

    不要忘了dofilter放行

     

    arg0.setCharacterEncoding("utf-8");

    arg2.doFilter(arg0, arg1);

     

    <filter>
          <filter-name>SetEncoding</filter-name>
          <filter-class>com.letben.filter.SetEncoding</filter-class>      
      </filter>
      <filter-mapping>
          <filter-name>SetEncoding</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>

    虽然是双向过滤,但是出的时候,已经在servlet中的方法体实现了内容的写出,到了过滤器对已经乱码的内容转码。已经没什么意义了,所以只能控制入口,出口并不能有什么好办法。

    下面是一个成型的版本:可以看一下。

     <filter>
          <filter-name>encodingFilter</filter-name>
          <filter-class>com.letben.filter.EncodingFilter</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>encodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping> 
      <filter>
          <filter-name>loginFilter</filter-name>
          <filter-class>com.letben.filter.LoginFilter</filter-class>
      </filter> 
      <filter-mapping>
          <filter-name>loginFilter</filter-name>
          <url-pattern>/com.letben.servlet.delogin.*</url-pattern>
          <url-pattern>/delogin/*</url-pattern>
      </filter-mapping>

    作为登录过滤器,和编码过滤器的设置方式,编码过滤器aoe就可以,但是作为登录过滤器来讲,有些内容允许访问,有些不允许,当然权限的开放与关闭,都还没有处理好。如果只是容许用户通过登录才能查看的话,那么上面的处理方式是合理的。解释:因为用户想要非法查看的mvc中的v和c,模型层不对外开放、也不可见。所以用户有必要看的就只有v和c。所以需要为v和c添加对应的过滤器,如果简单粗暴地aoe会导致,连登录页自身也不可访问。所以需要目录的设置,把登录页和登录页的对应逻辑空出来。在过滤器映射的时候,也要对应的将servlet也就是c层重新划分,将servlet去分成登录控制层和非登录控制层。这样就可以在配置的时候使用com.letben.servlet.delogin.*来处理所有需要登录才能访问的servlet逻辑,在页面方面,也将页面划成登录页面和非登录页面。在web.xml映射的时候配置出/delogin/*对应的页面。来处理所有通过直接在地址栏输入就能访问的事件。

    两个重定向注意体会:

    LoginServlet中:
    String name = request.getParameter("name");
            String password = request.getParameter("password");
            
            User user = userService.login(name, password);
            if(user!=null){
                System.out.println(user);
                request.getSession().setAttribute("user", user);
                request.getRequestDispatcher("delogin/index2.jsp").forward(request, response);
            }else{
                System.out.println("登录失败:用户名或者密码");
                response.sendRedirect("index.jsp");
            }
    LoginFilter中
    HttpServletRequest request = (HttpServletRequest) arg0;
            Object object = request.getSession().getAttribute("user");
            if(object!=null){//得到User
                arg2.doFilter(arg0, arg1);//放行
            }else{
                HttpServletResponse response = (HttpServletResponse) arg1;
                response.sendRedirect("http://localhost:8080/FilterForSafety02/index.jsp");
    //这里可能会出现回环,一定要定位到开始的位置。
    //bug在于,一旦从请求页中,直接申请一个子目录地址,如果发现该用户未登录,那么就在子目录中找寻登录页,找不到,就一直找,就会出现重定向循环。
            }

    LoginFilter中,在登录页面,输错了,就要重新输入,直接本页重定向就可以,但是在过滤器中,不知道用户登录到哪个页面进入了哪一层,这样就通过绝对路径,不通过“../”的形式,来回查找。

     

  • 相关阅读:
    【NOIP2007】守望者的逃离
    20200321(ABC)题解 by 马鸿儒 孙晨曦
    20200320(ABC)题解 by 王一帆
    20200319(ABC)题解 by 王一帆 梁延杰 丁智辰
    20200314(ABC)题解 by 董国梁 蒋丽君 章思航
    20200309(ABC)题解 by 梁延杰
    20200307(DEF)题解 by 孙晨曦
    20200306(ABC)题解 by 孙晨曦
    20200305(DEF)题解 by 孙晨曦
    20200303(ABC)题解 by 王锐,董国梁
  • 原文地址:https://www.cnblogs.com/letben/p/5185291.html
Copyright © 2011-2022 走看看