案例分析
项目的某些功能,必须登录才能访问。
没有登录的前提下,去访问订单、地址等页面都跳转到登录页面。
案例实现
LoginInterceptor
//拦截器使用第一步:实现一个接口HandlerInterceptor
//判断一下路径,如果访问的路径是order或address,判断是否登录,未登录就强制转到登录界面
public class LoginInterceptor implements HandlerInterceptor {
@Override
//true表示放行,不拦截
//false表示不放行,拦截
//Controller方法调用之前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("LoginInterceptor preHandle------------------------");
User user = (User) request.getSession().getAttribute("user");
if (user==null){
//request.getRequestURI() 返回除去host(域名或者ip)部分的路径
String address = request.getRequestURI();
System.out.println("address="+address);
if (address.contains("order")||address.contains("address")){
//request.getContextPath() 返回工程名部分,如果工程映射为/,此处返回则为空
String contextPath = request.getContextPath();
//强制到登录界面
response.sendRedirect(contextPath+"/login.jsp");
return false;
}
}
return true;
}
//Controller方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("LoginInterceptor postHandle------------------------");
}
//在DispatcherServlet 渲染了对应的视图之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("LoginInterceptor afterCompletion------------------------");
}
}
springmvc.xml
<!--拦截器使用第二步:配置拦截器-->
<mvc:interceptors>
<!--用于测试的拦截器-->
<mvc:interceptor>
<!--拦截路径的配置-->
<mvc:mapping path="/**"/>
<bean id="interceptor1" class="com.wzx.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
UserController
@Controller
public class UserController {
@RequestMapping("login.action")
public ModelAndView login(User user, HttpSession session){
ModelAndView mv= new ModelAndView();
if ("jack".equals(user.getUsername())&&"1234".equals(user.getPassword())){
session.setAttribute("user",user);
mv.setViewName("success");
return mv;
}
mv.setViewName("fail");
return mv;
}
}
success.jsp
<a href="${pageContext.request.contextPath}/order/query.action">查看我的订单</a>
测试OrderController
@Controller
@RequestMapping("/order")
public class OrderController {
@RequestMapping(path = "/query.action",method = {RequestMethod.GET,RequestMethod.POST})
public String query(Integer id){
System.out.println("你访问了我的订单功能 ");
return "order";
}
}