其他分享
首页 > 其他分享> > SpringMVC-----拦截器与国际化

SpringMVC-----拦截器与国际化

作者:互联网

拦截器

springmvc提供了拦截器机制:允许运行目标方法之前进行一些拦截工作,或者目标方法运行之后进行一些其他处理;
Filter:javaWeb
springmvc提供了拦截器机制:
在这里插入图片描述

perHandle:

在目标方法运行之前调用,返回boolean:
return true;(chain,doFilter)放行,反之。

postHandle:

在目标方法运行之后调用;

afterCompletion:

在请求整个完成之后;来到目标页面之后
chain.doFilter() 放行;资源响应之后;
1)拦截器是一个接口
2) 实现HandlerInterceptor
3) 配置拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>
   <!-- 配置某个拦截器 -->
   <bean class="com.atguigu.controller.InterceptorController"></bean>
<!-- 具体配置某个拦截器 -->
<mvc:interceptor>
<!-- 只拦截这个test请求 -->
<mvc:mapping path="/test01"/>
<bean class="com.atguigu.controller.InterceptorController"></bean>
</mvc:interceptor>
</mvc:interceptors>

拦截器的运行流程

正常运行流程
拦截器的preHandle------目标方法--------拦截器postHandle
·````````···~页面-------拦截器的afterCompletion
1a09f8feebd37978b4e.png)
在这里插入图片描述
其他流程:
1.只要preHandle不放行,其他流程就不会进行
2. 只要放行,afterCompletion都会执行;

多个拦截器:
正常流程:
在这里插入图片描述
异常流程:
1.不放行
哪一块不放行从此以后都没有
2.。如果有一个拦截器不放行,但是他前面放行的拦截器的afterCompletion总会执行;
在这里插入图片描述

流程:Filter的流程;
拦截器的preHandle:是按照顺序执行
拦截器的postHandle:是按照逆序执行
拦截器的afterCompletion:是按照逆序执行
已经放行的afterCompletion总会执行

什么时间用Filter,什么时间用拦截器?
如果某些功能需要其他组件配合完成, 我们就使用拦截器:
其他情况可以用Filter

国际化

1.写好国际化资源文件

Welcomeinfo=welcome to atguigu.com
username=USERNAME
password=PASSWORD
loginBtn=LOGI
Welcomeinfo=\u6B22\u8FCE\u6765\u5230\u7CFB\u7EDF
username=\u7528\u6237\u540D
password=\u5BC6\u7801
loginBtn=\u767B\u5F55

在这里插入图片描述

2.让Spring的RequestBundleMessageSource管理国际化资源文件

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="login"></property>
</bean>

3.直接去页面 取值

<h1><fmt:message key="Welcomeinfo"/></h1>
<form action="">
<fmt:message key="username"/><input type="text">
<br>
<fmt:message key="password"/><input type="password">
<br>
<input type="submit" value="<fmt:message key="loginBtn"/>">
<a href="tologin?locale=zh_CN">中文</a>
<a href="tologin?locale=en_US">英文</a>

</form>

点击中英文切换

1.实现国际化接口

package com.atguigu.controller;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.LocaleResolver;

public class MyLocaleResolver implements LocaleResolver {

	@Override
	public Locale resolveLocale(HttpServletRequest request) {
		Locale l= null;
		String parameter = request.getParameter("locale");
		//如果带了local参数就用参会指定的区域信息,如果没有就用req头的
		if (parameter !=null && !"".equals(parameter)) {
			l = new Locale(parameter.split("_")[0],parameter.split("_")[1]);
		}
		else {
			
			l = request.getLocale();
		}
		return  l;
	}

	@Override
	public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
		throw new UnsupportedOperationException(
				"Cannot change HTTP accept header - use a different locale resolution strategy"
				);
		
	}

}

<!-- 自定义区域解析器-->
 <bean id="localeResolver" class="com.atguigu.controller.MyLocaleResolver"></bean>

	@Autowired
	private MessageSource messageSource;
	
	@RequestMapping("/tologin")
	public String tologinPage(Locale locale) {
		return "hello";
		
	}

在这里插入图片描述
在这里插入图片描述

标签:拦截器,SpringMVC,流程,Locale,放行,-----,parameter,afterCompletion
来源: https://blog.csdn.net/weixin_51625266/article/details/119255265