1 Star 0 Fork 4

QIUCHAO99/ACCP-Y2

forked from zhangrentao/ACCP-Y2 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
springMVC-4.txt 5.15 KB
一键复制 编辑 原始数据 按行查看 历史
zhangrentao 提交于 2019-08-25 16:29 . 上传文件2
一、springMVC拦截器
拦截器是springMVC框架中一个类似于过滤器的组件,在WEB服务中它可以拦截指定请求,并对请求进行判断和处理,拦截器在过滤器之后执行,开发人员可以通过拦截器来实现如权限控制、防止重复提交请求、国际化等功能。
实现拦截器的步骤:
1、编写一个类,实现HandlerInterceptor接口,并重写3个方法
boolean preHandle(request,response,object):该方法在进入DispatcherServlet之前执行,它返回boolean类型(返回false时将不会继续执行),并有3个参数:
request:Servlet API中的HttpServletRequest对象
response:Servlet API中的HttpServletResponse对象
object:请求哪个Controller的哪个方法的Method对象(反射出来的方法)
void postHandler(request,response,object,modelAndView):该方法在执行控制器中的代码后执行,它有4个参数
modelAndView:从Controller中带回的Model和View的对象
void afterCompletion(request,response,object,exception):该方法在响应时执行,它有4个参数
exception:抛出的异常信息【如果没有抛出异常,则为null】
2、在配置文件中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/page/*"/> <!-- 配置拦截去需要拦截的请求 -->
<mvc:exclude-mapping path="/page/*.css" /> <!-- 配置拦截器排除的请求 -->
<bean class="拦截器类的全路径" />
</mvc:interceptor>
</mvc:interceptors>
注意事项:
1、只有发送请求到Controller中才会进入拦截器【这点与过滤器不一样】
2、拦截器可以配置多个,按照配置文件中的顺序依次执行
3、拦截器如果返回false,则会终止请求,显示空白页面,所以一般要结合重定向
二、使用拦截器做权限控制思路:
1、将需要登陆才能访问的页面存放到某个目录 /user/xxx
2、使用拦截器拦截这个目录下的所有请求/user/**
3、在拦截器中获取session中的用户对象,判断是否为空
4、如果空,则认为没有登陆,则不允许访问,重定向到登陆页面,并返回false
三、使用拦截器做防止表单重复提交思路【以注册为例子】:
1、不允许直接访问注册的jsp页面,而是先用GET提交访问Controller
2、在Controller的GET方法中生成一个token安全令牌,并存入session和request
3、在注册表单将request中的token当作表单的隐藏元素
4、发送POST请求Controller执行注册,并销毁session中的token
5、编写拦截器,在拦截器中拦截注册的POST请求,并判断session中是否还存在token令牌,如果session中存在,且与request中的token的值相等,则返回true,否则返回false
6、刷新页面重复提交表单时,由于session中的token在之前注册时已销毁,所以拦截器会返回false,并成功阻止重复提交表单
四、国际化(i18n)
国际化可以让项目支持多国语言,而无需重新开发一套系统,spring通过将国际化内容编写成属性文件(properties文件),并在页面中可以根据语言设置来加载指定文件中的内容,springMVC提供了内置拦截器LocaleChangeInterceptor来实现国际化。
国际化文件的命名规范:文件名_语言_国家.properties
注意:
1、必须存放在src目录,或是其子目录
2、文件名都是一样的,例如i18n
3、语言是小写,国家是大写,如中国的语言是zh,国家是CN
4、文件内容以键值对的方式保存数据,且各文件中都有这个键
5、键的命名规范:为防止同名,一般采用页面名.键
6、一个项目可以有多个国际化文件
7、国际化文件中的内容的参数可以用{0}、{1}这种带下标的占位符
例如:
中国:i18n_zh_CN.properties
index.getting=欢迎你 {0}
美国:i18n_en_US.properties
index.getting=welcome {0}
五、在spring中测试国际化:
1、在src目录下新建国际化属性文件
2、在spring配置文件中加入配置
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>i18n</value>
</list>
</property>
</bean>
3、编写main方法,测试国际化
ApplicationContext context = new ClassPathXmlApplicationContext(配置文件);
MessageSource messageSource=(MessageSource)context.getBean("customResource");
String cnmsg = messageSource.getMessage("键名",参数数组,Locale.CHINA);
String usmsg = messageSource.getMessage("键名",参数数组,Locale.US);
System.out.println("中国:"+cnmsg);
System.out.println("美国:"+usmsg);
六、springMVC配置国际化步骤
1、在src目录编写国际化属性文件
2、在spring中加入两个bean
a、加入ResourceBundleMessageSource【id不能乱写】
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 配置basename或basenames:指定国际化文件的路径 -->
<property name="basenames">
<list>
<value>com.cssl.mvc04.i18n.i18n</value>
</list>
</property>
</bean>
b、加入SessionLocaleResolver【id不能乱写】
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
</beans>
3、在spring中加入i18n中的LocaleChangeInterceptor拦截器配置
<mvc:interceptors>
<!-- 国际化的拦截器 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" /> <!-- 可以通过?lang=en_US改变语言环境 -->
</bean>
</mvc:interceptors>
4、在页面中使用spring标签库的message标签使用国际化
a、导入标签库
<%@ taglib prefix="sp" uri="http://www.springframework.org/tags" %>
b、使用message标签code="键"来获取国际化内容
<sp:message code="key" />
c、也可以将国际化内容存储到页面中,然后使用el表达式获取值
<sp:message code="key" var="name" />
${name}
d、如果国际化文字中有占位符,则用arguments属性设置值,可以设多个值
<sp:message code="key" arguments="占位符参数的值" />
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/qiuchao99/ACCP-Y2.git
[email protected]:qiuchao99/ACCP-Y2.git
qiuchao99
ACCP-Y2
ACCP-Y2
master

搜索帮助