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

     

  • 相关阅读:
    2021/3/12
    2021/3/11
    2021/3/10
    2021/3/9
    2021/3/8
    2021/3/5
    2021/3/4
    2021/3/3
    2021/3/2
    2021/3/1
  • 原文地址:https://www.cnblogs.com/letben/p/5185291.html
Copyright © 2011-2022 走看看