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

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

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

也不需要增加header信息,

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

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

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

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

二,演示项目的相关信息

1,项目地址

https://github.com/liuhongdi/international

2,项目功能说明

演示了用cookie保存i18n信息

3,项目结构:如图:

三,配置文件说明

1,pom.xml

        <!--thymeleaf begin-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--thymeleaf end-->

2,application.properties

#error
server.error.include-stacktrace=always
#error
logging.level.org.springframework.web=trace #thymeleaf
spring.thymeleaf.cache=false
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.mode=HTML
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html #i18n,多个文件时要用逗号隔开,例:i18n.login,i18n.admin,i18n.goods
spring.messages.basename = i18n.login

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

3,i18n的properties文件:

login.properites

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

login_zh_CN.properties

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

login_en_US.properties

login.username=username
login.password=password
login.btn=Sign in
login.remember = Remember Me
login.tip = Please Sign in

四,java代码说明

1,MyLocaleResolver.java

//解析locale,采用cookie,避免每次都传递参数
public class MyLocaleResolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest httpServletRequest) {
//得到cookie,解析locale
Cookie[] cookies = httpServletRequest.getCookies();
Locale locale = Locale.getDefault();
if(cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
if (cookie.getName().equals("selectedLang")) {
String temp = cookie.getValue();
if (!StringUtils.isEmpty(temp)) {
String[] s = temp.split("_");
locale = new Locale(s[0],s[1]);
}
}
}
}
/*通过参数解析locale
String temp = httpServletRequest.getParameter("locale");
Locale locale = Locale.getDefault();
if (!StringUtils.isEmpty(temp)) {
String[] s = temp.split("_");
locale = new Locale(s[0],s[1]);
}
*/
return locale;
} @Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { }
}

2,MyLocaleResolverConfig.java

@Configuration
public class MyLocaleResolverConfig {
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}
}

生成localRsolver的bean

3,LoginController.java

@Controller
@RequestMapping("/login")
public class LoginController {
//登录页面
@GetMapping("/login")
public String login(Model model) {
return "login/login.html";
}
}

4,login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>login</title>
</head>
<body>
<div style="width:100%;height:30px;background:#ffffff;font-size: 16px;" ></div>
<div id="content" style="width:1040px;">
<div style="width:790px;float:left;margin-left:30px;">
<!--main begin-->
<form class="form-signin" action="dashboard.html">
<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>
<label class="sr-only" th:text="#{login.username}">Username</label>
<input type="text" class="form-control" placeholder="Username" th:placeholder="#{login.username}" required="" autofocus="">
<br/>
<br/>
<label class="sr-only" th:text="#{login.password}">Password</label>
<input type="password" class="form-control" placeholder="Password" th:placeholder="#{login.password}" required="">
<div class="checkbox mb-3">
<label>
<!--input是自闭标签所以使用 thymeleaf的行内写法-->
<input type="checkbox" value="remember-me"> [[#{login.remember}]]
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.btn}">Sign in</button>
<p class="mt-5 mb-3 text-muted"> 2017-2018</p>
<a class="btn btn-sm" href="javascript:setLang('zh_CN')">中文</a>
<a class="btn btn-sm" href="javascript:setLang('en_US')">English</a>
</form>
<!--main end-->
</div>
</div>
<script>
//设置选中的语言
function setLang(langName) {
var exdays = 1;
setCookie("selectedLang",langName,exdays);
//刷新当前页面
window.location.reload();
} //设置cookie
function setCookie(cname,cvalue,exdays) {
var d = new Date();
d.setTime(d.getTime()+(exdays*24*60*60*1000));
var expires = "expires="+d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires;
}
</script>
</body>
</html>

五,测试效果

1,访问:

http://127.0.0.1:8080/login/login

返回:

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

查看所保存的cookie

六,查看spring boot的版本

  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: 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. python基础三(集合、文件)

    1.集合定义 集合天生能去重,且与字典一样,无序.集合用大括号括起来,里面的元素之间用逗号分隔,要跟字典区分开. 集合定义方法:s=set() #定义一个空集合 s={'1','a','b','c', ...

  2. (课堂笔记)第三章:F5 LTM 负载均衡理论

    BIG-IP LTM负载均衡理论 ------F5 BIG-IP LTM负载均衡策略---------- 1.1 LTM VS工作模式F5 BIG-IP LTM的内部对于数据包的处理方式,即是VS的工 ...

  3. SpringMVC-08-整合SSM之CRUD

    查询书籍功能 完善Controller:BookController @Controller @RequestMapping("/book") public class BookC ...

  4. Python实现加密压缩成RAR或ZIP文件

    博主在前两篇博文分别介绍了加密RAR文件的解压https://www.cnblogs.com/kangbazi666/p/13646308.html和加密ZIP文件的解压https://www.cnb ...

  5. 分布式系统监视zabbix讲解七之分布式监控

    分布式监控 概述 Zabbix通过Zabbix proxy为IT基础设施提供有效和可用的分布式监控 代理(proxy)可用于代替Zabbix server本地收集数据,然后将数据报告给服务器. Pro ...

  6. JVM学习(八)指令重排序

    一.数据依赖性 在学习JVM的指令重排序之前,我们先了解一下什么是数据依赖性: 编译器和处理器在处理具体的指令时,可能会对操作进行重排序来提高执行性能[多条指令并行执行,所以提升性能的同时也可能会导致 ...

  7. redis 的基本使用

    Linux上查看redis是否运行 ps -ef | grep redis  还能查看到Linux的安装路径. set  rediskey  redisvalue  在redis里面存储了一个名称为r ...

  8. [BJDCTF 2nd]文件探测

    [BJDCTF 2nd]文件探测 这两天刷题碰到了一道稍微有难度的题,记录一下,有一些点是未被掌握到的. home.php: <?php setcookie("y1ng", ...

  9. 使用eclipse启动tomcat,正常模式下可以启动tomcat,却在debug模式下无法启动tomcat 问题解决

    这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动tomcat时,发生了读取文件错误,eclipse自动设置了断点,导致tomcat不能正常启动. 解决方法把brea ...

  10. Typora操作总结

    Typora 1. Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档 1.1 目录  [toc] 2. 结构类操作 2.1 多级标题  #       一级标题   ...