springmvc提供了拦截器机制:允许运行目标方法之前进行一些拦截工作,或者目标方法运行之后进行一些其他处理;
Filter:javaWeb
springmvc提供了拦截器机制:
在目标方法运行之前调用,返回boolean:
return true;(chain,doFilter)放行,反之。
在目标方法运行之后调用;
在请求整个完成之后;来到目标页面之后
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
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
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="login"></property> </bean>
<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"; }