一,用cookie保存i18n信息的优点?

当开发一个web项目(非api站)时,如果把i18n的选择信息保存到cookie,

则不需要在每次发送请求时都传递所选择语言的参数,

也不需要增加header信息,

会使开发更方便更节省时间

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,演示项目的相关信息

1,项目地址

  1. https://github.com/liuhongdi/international

2,项目功能说明

演示了用cookie保存i18n信息

3,项目结构:如图:

三,配置文件说明

1,pom.xml

  1. <!--thymeleaf begin-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  5. </dependency>
  6. <!--thymeleaf end-->

2,application.properties

  1. #error
  2. server.error.include-stacktrace=always
  3. #error
  4. logging.level.org.springframework.web=trace
  5.  
  6. #thymeleaf
  7. spring.thymeleaf.cache=false
  8. spring.thymeleaf.encoding=UTF-8
  9. spring.thymeleaf.mode=HTML
  10. spring.thymeleaf.prefix=classpath:/templates/
  11. spring.thymeleaf.suffix=.html
  12.  
  13. #i18n,多个文件时要用逗号隔开,例:i18n.login,i18n.admin,i18n.goods
  14. spring.messages.basename = i18n.login

说明:spring.messages.basename 用来指定语言的默认配置

3,i18n的properties文件:

login.properites

  1. login.username=用户名
  2. login.password=密码
  3. login.btn=登录
  4. login.remember = 自动登录
  5. login.tip = 请输入用户名密码登录

login_zh_CN.properties

  1. login.username=用户名
  2. login.password=密码
  3. login.btn=登录
  4. login.remember = 自动登录
  5. login.tip = 请输入用户名密码登录

login_en_US.properties

  1. login.username=username
  2. login.password=password
  3. login.btn=Sign in
  4. login.remember = Remember Me
  5. login.tip = Please Sign in

四,java代码说明

1,MyLocaleResolver.java

  1. //解析locale,采用cookie,避免每次都传递参数
  2. public class MyLocaleResolver implements LocaleResolver {
  3. @Override
  4. public Locale resolveLocale(HttpServletRequest httpServletRequest) {
  5. //得到cookie,解析locale
  6. Cookie[] cookies = httpServletRequest.getCookies();
  7. Locale locale = Locale.getDefault();
  8. if(cookies != null) {
  9. for (Cookie cookie : cookies) {
  10. System.out.println(cookie.getName());
  11. System.out.println(cookie.getValue());
  12. if (cookie.getName().equals("selectedLang")) {
  13. String temp = cookie.getValue();
  14. if (!StringUtils.isEmpty(temp)) {
  15. String[] s = temp.split("_");
  16. locale = new Locale(s[0],s[1]);
  17. }
  18. }
  19. }
  20. }
  21. /*通过参数解析locale
  22. String temp = httpServletRequest.getParameter("locale");
  23. Locale locale = Locale.getDefault();
  24. if (!StringUtils.isEmpty(temp)) {
  25. String[] s = temp.split("_");
  26. locale = new Locale(s[0],s[1]);
  27. }
  28. */
  29. return locale;
  30. }
  31.  
  32. @Override
  33. public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
  34.  
  35. }
  36. }

2,MyLocaleResolverConfig.java

  1. @Configuration
  2. public class MyLocaleResolverConfig {
  3. @Bean
  4. public LocaleResolver localeResolver() {
  5. return new MyLocaleResolver();
  6. }
  7. }

生成localRsolver的bean

3,LoginController.java

  1. @Controller
  2. @RequestMapping("/login")
  3. public class LoginController {
  4. //登录页面
  5. @GetMapping("/login")
  6. public String login(Model model) {
  7. return "login/login.html";
  8. }
  9. }

4,login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>login</title>
  6. </head>
  7. <body>
  8. <div style="width:100%;height:30px;background:#ffffff;font-size: 16px;" ></div>
  9. <div id="content" style="width:1040px;">
  10. <div style="width:790px;float:left;margin-left:30px;">
  11. <!--main begin-->
  12. <form class="form-signin" action="dashboard.html">
  13. <h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>
  14. <label class="sr-only" th:text="#{login.username}">Username</label>
  15. <input type="text" class="form-control" placeholder="Username" th:placeholder="#{login.username}" required="" autofocus="">
  16. <br/>
  17. <br/>
  18. <label class="sr-only" th:text="#{login.password}">Password</label>
  19. <input type="password" class="form-control" placeholder="Password" th:placeholder="#{login.password}" required="">
  20. <div class="checkbox mb-3">
  21. <label>
  22. <!--input是自闭标签所以使用 thymeleaf的行内写法-->
  23. <input type="checkbox" value="remember-me"> [[#{login.remember}]]
  24. </label>
  25. </div>
  26. <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.btn}">Sign in</button>
  27. <p class="mt-5 mb-3 text-muted"> 2017-2018</p>
  28. <a class="btn btn-sm" href="javascript:setLang('zh_CN')">中文</a>
  29. <a class="btn btn-sm" href="javascript:setLang('en_US')">English</a>
  30. </form>
  31. <!--main end-->
  32. </div>
  33. </div>
  34. <script>
  35. //设置选中的语言
  36. function setLang(langName) {
  37. var exdays = 1;
  38. setCookie("selectedLang",langName,exdays);
  39. //刷新当前页面
  40. window.location.reload();
  41. }
  42.  
  43. //设置cookie
  44. function setCookie(cname,cvalue,exdays) {
  45. var d = new Date();
  46. d.setTime(d.getTime()+(exdays*24*60*60*1000));
  47. var expires = "expires="+d.toGMTString();
  48. document.cookie = cname + "=" + cvalue + "; " + expires;
  49. }
  50. </script>
  51. </body>
  52. </html>

五,测试效果

1,访问:

  1. http://127.0.0.1:8080/login/login

返回:

点击下面的 中文 english两个链接可以看到效果:

查看所保存的cookie

六,查看spring boot的版本

  1. . ____ _ __ _ _
  2. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
  3. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
  4. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  5. ' |____| .__|_| |_|_| |_\__, | / / / /
  6. =========|_|==============|___/=/_/_/_/
  7. :: Spring Boot :: (v2.3.3.RELEASE)

spring boot:用cookie保存i18n信息避免每次请求时传递参数(spring boot 2.3.3)的更多相关文章

  1. session不一定非得要cookie开启才能使用。也可以使用get传递参数

    session不一定非得要cookie开启才能使用.也可以使用get传递参数 可以将session_id();设置为一个常量. define(’s_id‘ ,$_COOKIE['session_nam ...

  2. Spring MVC 页面跳转时传递参数

    页面仍然使用 JSP,在跳转时如果想传递参数则需要用到类 RedirectAttributes. 首先看看如何打开一个普通页面: // 登录页面(每个页面都要独立的 Action 来支持其呈现) @R ...

  3. 10 ~ express ~ 使用 cookie 保存用户 信息

    思维导图: (1) 保存 cookie (2)销毁 cookie 一,保存 cookie 1,app.js  . 新增代码 var Cookies = require('cookies') /** * ...

  4. asp.net下使用Cookie保存登录信息

    在网页中登录窗口是最常见的,如果把登录信息存在客户机Cookie中,下次用户登录时,网页先在客户机上查找登录信息,如果成功即可跳过登录步骤直接到主窗口,如登录界面如下:

  5. JWT如何在Spring Cloud微服务系统中在服务相互调时传递

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78676036 本文出自方志朋的博客 在微服务系统中,为了保证微服务系统的安全,常常使用jw ...

  6. java的web项目中使用cookie保存用户登陆信息

    本文转自:http://lever0066.iteye.com/blog/1735963 最近在编写论坛系统的实现,其中就涉及到用户登陆后保持会话直到浏览器关闭,同时可以使用cookie保存登陆信息以 ...

  7. 花时三月 终于Spring Boot 微信点餐开源系统! 附源码

    架构 前后端分离:             Nginx与Tomcat的关系在这篇文章,几分钟可以快速了解: https://www.jianshu.com/p/22dcb7ef9172 补充: set ...

  8. Spring整合JDBC(连接池、JDBC模板、Dao配置到Spring容器、配置文件的优化)

    1.Spring整合JDBC (1)导包(共12个): c3p0连接池.JDBC驱动(4个) Spring-jdbc.Spring-tx事务(2个) (2)JDBC模板对象(JDBCTemplate) ...

  9. 保存登录信息的Cookie加密技术

    所有需要账户登录的website 基本都会想到这样一个问题, 如何保持用户在一定时间内登录有效. 最近本人就在项目中遇到这样的需求,某些页面只能Admin账户登录后访问, 当登录Admin账户后如何才 ...

随机推荐

  1. List和Dictionary的使用技巧总结

    List和Dictionary想必是我们平常用到最多的C#容器了,他们使用起来都很简单,所以很多人就可能就没去深究,其实在使用过程中有很多的小技巧能让我们写的代码变得更高效也更安全. 1·合理的指定初 ...

  2. python中的锁lock=threading.Lock()

    避免多个线程保卫同一块数据的时候,产生错误,所以加锁来防止这种问题 个人理解:当打印结果是交替打印时,但是如果需求是需要打印完一个线程的内容后,再去打印另一个线程的内容,就需要用到锁 不加锁打印结果: ...

  3. IDEA使用 live template添加groovy脚本给方法,类,js方法添加注释(转载)

    IDEA添加Live Template: File->Setting->Editor->Live Templates Abbreviation: * Template text: * ...

  4. JVM--先说本地方法接口

    本地方法接口 在讲Java虚拟机运行时数据区中本地方法栈之前,我们先来说说运行时数据区之外的一个叫本地方法接口的东西简称JNI(Java Native Interface) 简单来讲,一个Native ...

  5. HTML+CSS使用swiper快速生成最简单、最快捷、最易看懂的轮播图

    1.  在网页顶部输入swiper.com.con,进入swiper官网 2.   点击" API文档",获取轮播图代码的地方 3.   点击左侧"swiper初始化&q ...

  6. 【转】Locust-工具核心原理分析

    Locust工具在市场上不如Loadrunner / JMeter流行,使用的范围也没有那么广,但不可否认其是一款很不错的工具.我个人觉得Locust使用不是那么广泛,主要是因为一下方式: Locus ...

  7. 关于Apache报错 couldn't perform authentication. AuthType not set!

    今天在使用apache搭建yum的web服务时,配置完成后.访问http://ip 时,浏览器报错:500 Internal Server Error 然后查询error.log发现,有如下错误提示: ...

  8. vue入门(一)----工程vue_sell

    1.利用vue脚手架工具创建vue,webpack工程目录 npm install -g vue-cli  安装vue脚手架 vue init webpack sell 初始化一个webpack模板, ...

  9. 能否使用GHDL+GTKWave代替Quartus ii

    能否使用GHDL+GTKWave代替Quartus ii macOS High Sierra系统 10.13.6 [toc] 先给出答案 可以替代一部分功能 如果你是一个学工科的学生,正在学习EDA. ...

  10. 测试工具-XPath使用

    XML有两种MIME类型,即application/xml和text/xml,在HTTP中,MIME Type类型被定义在Content-Type header中.我们经常也会看到接口返回数据类型为X ...