国际化预过滤器

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,下面的能够正常展示,但是在标题里面,就有问题

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

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

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

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

时间: 2024-12-21 09:46:29

国际化预过滤器的相关文章

iOS10权限声明国际化

1.xCode8权限 xCode8.0开始苹果对隐私权限的控制更加严格,并且在隐私权限对应的描述不能为空,否则提交时在活动里面并看不到你提交的二进制文件,并给开发者邮箱发送以下邮件 2.权限描述国际化 解决办法是在Info.plist中添加Privacy - Camera Usage Description和Privacy - Photo Library Usage Description. 如果直接写在Info.plist中,则不能多语言显示提示,想要多语言提示,可以选中Info.plist文

Django1.9开发博客(12)- i18n国际化

国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页. Django能完美支持文本翻译.日期时间和数字的格式化.时区. 另外,Django还有两点优势: 允许开发者和模板作者指定他们哪些app应该被翻译或被格式化为本地形式. 允许用户根据自己的偏好来实现本地化显示.翻译依据语言,格式化依据国家, 这些信息由浏览器中的Accept-Language头来决定.不过目前为止时区还未能实现. 参考官方文档:https://docs.djangoproject.com/en/1.9

AngularJS 国际化——Angular-translate

对于一个用户群面向全球的的应用来说,不得不考虑国际化的问题.当然,即便是刚刚起步的小应用,如果有心搞大,也应该提前设计国际化的方案. 本篇讲述使用AngularJS构建的应用的简单国际化方案,准确的说,是国际化服务.... i18n与l10n i18n是Internationalization得缩写,取第一个字母和最后一个字母,以及中间省略的字母数目,即i18n,类似的l10n是Localization得意思. 通常i18n是国际化的意思,就是在不改变源码的情况下,通过某些简单的配置就能适应不同

JAVA国际化

大家好,我是成都[LD],今天给大家带来的是JAVA国际化.如果您用过Struts,那您对国际化应该并不陌生. 通常来说,在代码中我们会夹杂一些字符串,这样其实并不好看,维护起来也不是特别方便.举个例子:假设你开发系统是中文版本,突然来了个需求,需要英文版本,如果你将字符串写在代码里面,这样你又不得不将所有的中文字符替换成英文字符.为了减少这种需求下重复劳动,我们通常会自己去写一个配置文件,然后将所有字符串放在配置文件里面,然后去读这个配置文件等等一系列的操作.当然这属于我们自己的一种解决问题的

Spring boot 国际化自动加载资源文件问题

Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义正确的资源文件路径,Spring boot就启动时就会自动加载资源. spring.messages.basename=i18n/message 但是我的项目修改后获取消息时系统报错,找不到对应语言的资源配置.于是试图找到原因.Google好久都没找到,简直好像就我一个人遇到这鬼问题一样??.只好自

JSTLView快速国际化(SpringMVC)

JSTLView:快速国际化:只要导入了jstl的jar包,以前默认创建的InternalResouceView都会被使用jstlView替代: 国际化的新步骤: 1).写好国际化资源文件 il118_en_US.properties il118_zh_CN.properties 2).在SpringMVC配置文件中配置管理国际化资源文件的消息管理器组件 <!-- 注册一个国际化资源管理器:id必须是messageSource --> <bean id="messageSour

spring和springmvc国际化应用

目的: @1在视图层显示的文字显国际化 @2数据验证后显示国际化 @3通过超链接的参数,让客户自动选择国际化 1:在spring.xml中配置国际化类,让容器管理国际化 2:在页面显示国际化:可以使用spring的标签<st:message code="userName"></st:message> @2数据验证 1: 代码层数据验证:自动装配 MessageSource source java代码层根据不同的区域获取不同语言的错误信息,并将错误信息添加至结果中

struts2学习(10)struts2国际化

一.国际化简介: 二.struts2国际化设置: struts.xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dt

spring国际化,基于数据库的信息配置

之前在做spring国际化的时候,资源文件都是写在properties里面,管理起来不是很方便,今天我将这些资源文件都保存在数据库中,启动的时候进行初始化操作,从而进行多语言的管理.这里记录下过程: 其他的操作还是跟之前一样,这里就不多解释了,直接贴上对应的配置或者代码信息.使用spring框架,我这里用了两个配置文件,一个是springmvc.xm,另一个是spring-framework.xml文件,主要是想分开进行配置. 国际化配置在spring-webmvc这个jar的org.sprin