拦截器在一个Controller中使用和在多个Controller中的跳转是不同的情况,下面来一一的介绍。
1.在一个controller中使用
(1)定义拦截器类
package cn.bishe.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class CommonInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String name = (String) request.getSession().getAttribute("usersession");
if(name == null || name==""){
//request.getRequestDispatcher("loginPage.action").include(request, response);
request.getRequestDispatcher("loginPage.action").forward(request, response);
return false;
}else
return true;
}
}
(2)在springmvc.xml中定义拦截器
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/writeblogPage.action" />
<bean class="cn.bishe.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
用户请求writeblogPage.action的时候会先被拦截器拦截,判断使用是否已经登录,登录成功之后放行,允许执行用户的请求writeblogPage.action路径。用户没有登录的时候跳转到当前Controller的登录的action路径。(意思就是请求的writeblogPage.action和跳转登录的loginPage.action需要在一个Controller中)
2.在多个controller中使用
如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能拦截每个不同的Controller。
(1)定义拦截器类
package cn.bishe.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class CommonInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String name = (String) request.getSession().getAttribute("usersession");
if(name == null || name==""){
//request.getRequestDispatcher("loginPage.action").include(request, response);
request.getRequestDispatcher("loginPage.action").forward(request, response);
return false;
}else
return true;
}
}
package cn.bishe.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class CommonInterceptor1 extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String name = (String) request.getSession().getAttribute("usersession");
if(name == null || name==""){
request.getRequestDispatcher("loginPage1.action").include(request, response);
return false;
}else
return true;
}
}
(2)springmvc.xml文件中配置多个拦截器
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/writeblogPage.action" />
<bean class="cn.bishe.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors> 拦截Controller1
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/res/resUploadPage.action" />
<mvc:mapping path="/res/filedownload.action" />
<bean class="cn.bishe.interceptor.CommonInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors> 拦截Controller2
两个拦截器都要跳到loginPage.action去,但是这个action在其中一个controller中,拦截器不能跨controller,所以只能把这个action复制一份放在另一个controller中,然后把RequestMapping的名字改一下,可以改成loginPage1.action。
(3)两个controller
//用户登录页面
@RequestMapping(value="loginPage.action")
public String toLoginPage(){
return "login";
}
//用户登录页面
@RequestMapping(value="loginPage1.action")
public String toLoginPage(){
return "login";
}