1.定义的类实现拦截器的接口
HandlerInteceptor
2.配置springmvc.xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itedu.interceptor.MyInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
3.书写拦截器的业务逻辑
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
String uri = arg0.getRequestURI();
if(!uri.contains("/login.action")){
//如果不包含
if(arg0.getSession().getAttribute("username")==null){
arg1.setCharacterEncoding("utf-8");
arg1.sendRedirect("login.action");
return false;
}
}
return true;
}
我粗心写错的时候是这样的
如下的结果首先因为输入的地址包含了login.action时,所以if不走,直接进行拦截,这时候出现一片空白
纯文本文件的字符编码未声明。如果该文件包含 US-ASCII 范围之外的字符,该文件将在某些浏览器配置中呈现为乱码。该文件的字符编码需要在传输协议层声明,或者在文件中加入一个 BOM(字节顺序标记)。
当输入的地址不是login.action时,确实能够实现重定向,但是重定向之后,会再次被拦截拦截到,这时候页面的地址是包含login.action,所以这时候也对页面进行拦截了。所以这时候也是出现了一片空白,也就是出现了上述的第一种情况,所以从逻辑上来说,你要跳转到的页面是不应该被拦截的,不然的话,你会出现一片空白
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
String uri = arg0.getRequestURI();
if(!uri.contains("login.action")){
if(arg0.getSession().getAttribute("username")!=null){
return true;
}else{
arg1.setCharacterEncoding("utf-8");
arg1.sendRedirect("login.action");
}
}
return false;
}