一、SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的。
它的主要作用是拦截用户的请求并进行相应的处理,通常还有如下作用:
(1)日志记录
(2)权限检查
(3)性能监控
(4)通用行为
二、SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的:
效果
1、
定义的Interceptor类要实现了Spring的HandlerInterceptor 接口
2、
定义的Interceptor类可以而
继承HandlerInterceptorAdapter 类来实现
其中:HandlerInterceptor有3个方法如下:
preHandle (HttpServletRequest request, HttpServletResponse response, Object handle),在请求处理之前进行调用。
postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView),请求进行处理之后调用
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex) ,整个请求结束之后(渲染了对应的视图之后)调用。
三、自定义拦截器
当单击【用户中心】时,如果用户没有登录,则返回登录页面!
package com.hlx.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 登录拦截 --实现这个HandlerInterceptor接口
*
* @author Administrator
*
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
System.out.println("--->afterCompletion!");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
System.out.println("--->postHandle");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
//
System.out.println("--->preHandle!");
//如果用户没有登录,则返回登录页面
Object user = arg0.getSession().getAttribute("USER_SESSION_KEY");
System.out.println("user="+user);
if(user==null){
arg1.sendRedirect("/springmvc4/login.html");
return false;
}
return true;
}
}
四、 SpringMVC中配置拦截器
五、创建工程如下
六、其他的配置文件与springmvc3相同
七、JSP页面
login.jsp
<div style="margin:0 auto; padding-top: 100px;" align="center">
<form action="dologin.html" method="post">
<p>
<span>用户名:</span><input type="text" name="uname">
</p>
<p>
<span>密 码:</span><input type="password" name="upass">
</p>
<p>
<input type="submit" value="登录">
</p>
</form>
</div>
userhome.jsp
<div style="margin:0 auto; padding-top: 100px;" align="center">
<h1>恭喜您,【${USER_SESSION_KEY.uname}】 登录用户中心!</h1>
<a href="/springmvc4/logout.html">退出登录</a>
</div>
index.jsp
<div style="margin:0 auto; background:snow; padding-top: 100px;"
align="center">
<a href="login.html">登录</a><p/>
<a href="user/home.html">用户中心</a><p/>
<a href="exception.html">触发异常</a><p/>
</div>
八、控制类
package com.hlx.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
import com.hlx.bean.User;
import com.hlx.exception.MyException;
import com.hlx.service.UserService;
@Controller
// 保存user对象
public class LoginController
// 业务层
@Resource
private UserService userService;
// 请求对象
@Resource
private HttpServletRequest request;
/*
* 登录页面
*/
@RequestMapping("/login")
public String toLoginPage() {
return "/jsp/login.jsp";
}
/**
* 引发异常页面
*
* @throws Exception
*/
@RequestMapping("/exception")
public void doException() throws Exception {
throw new MyException("发生异常啦!");
}
/**
* 中心页面
*
* @return
*/
@RequestMapping("/user/home")
public String toHomePage() {
return "/jsp/userhome.jsp";
}
/**
* 处理登录
*
* @param uname
* 表单传过来的参数
* @param upass
* @param request
* 请求对象
* @return
*/
@RequestMapping(value = "dologin", method = RequestMethod.POST)
public String doLogin(@RequestParam String uname,
@RequestParam String upass, HttpServletRequest request) {
try {
// 调用方法
User user = userService.doLogin(uname, upass);
// (2)原生会话
request.getSession().setAttribute("USER_SESSION_KEY", user);
return "/jsp/userhome.jsp";// 返回用户中心页面
} catch (Exception e) {
// TODO: handle exception
request.setAttribute("error", e.getMessage()); // 提示错误消息
return "/jsp/login.jsp"; // 返回登录页面
}
}
/**
* 退出
*
* @return
*/
@RequestMapping("logout")
public String doLogout() {
// 使会话失效
request.getSession().invalidate();
request.getSession().removeAttribute("USER_SESSION_KEY");
// 返回登录页面
return "/jsp/login.jsp";
}
}
效果
1)访问首页index.jsp
2)单击“”用户中心“”,用户为空,则就进行拦截了,则返回到login.html页面
输入用户名:mike 密码:aaa
3)点击登录后,显示
4)返回首页index.jsp 再次单击【用户中心】,显示如下效果
5)单击【退出登录】
异常处理在项目的开发中,每个异常都单独处理,系统的代码耦合度高,工作量大:
(1)
使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver
(2)
实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
(3)
使用@ExceptionHandler注解实现异常处理(最简单,完成零配置)
使用@ExceptionHandler注解实现异常处理:
(1)增加BaseController类,并在类中使用@ExceptionHandler注解声明异常处理
package com.hlx.exception;
/**
* 自定义异常
* @author Administrator
*
*/
public class MyException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
public MyException(String message) {
super(message);
}
}
package com.hlx.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.hlx.exception.MyException;
public class BaseController {
//MyException.class限制某个异常,如果不写,就默认是所有的Exception
@ExceptionHandler(MyException.class)
public String handleException(Exception ex, HttpServletRequest request) {
// 保存请求错误信息
request.setAttribute("error", ex.getMessage());
// 跳转到错误页面
return "jsp/exception.jsp";
}
}
(2)使所有需要异常处理的Controller都继承BaseController类
@Controller
// 保存user对象
public class LoginController extends BaseController { // 继承BaseController引发异常 。。。。}
// 保存user对象
public class LoginController extends BaseController { // 继承BaseController引发异常 。。。。}
(3)JSP页面 exception.jsp
<div style="margin:0 auto; padding-top: 100px; color:red;" align="center">
<h1>服务器发生异常:${error }</h1>
</div>
(4) 效果
单击【触发异常】
总结:使用SpringMVC 中的自定义拦截器并实现异常处理!