监听器,获取用户设备信息
package com.xingxue.Interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
public class InterceptorA implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Enumeration<String> names = request.getHeaderNames();
while(names.hasMoreElements()){
String n=names.nextElement();
String v=request.getHeader(n);
System.out.println(n+" "+v);
}
System.out.println("拦截前+++");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截后+++");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("最终+++");
}
}
题解
异常处理
package com.xingxue.springmvc;
import com.xingxue.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/demo")
public class DemoController {
@RequestMapping("/index")
public String index(){
return "demo";
}
@RequestMapping("/login")
public String login2(){
User u=new User();
u=null;
u.toString();
return "login";
}
@ExceptionHandler(Exception.class)
public String error(Exception e){
System.out.println(e);
return "error";
}
}
在实际开发过程中,我们通常会把应用后端分为3层来开发,Controller(控制器) Service(服务层) Dao(数据访问层),这3层都可能会有异常的发生,通常的做法是把异常,由 DAO 抛到 Service 再抛到 Controller,最后再控制其中处理异常。这样可以把异常反馈給最顶层调用者处理。但是一个系统中有若干个Controller ,若干个方法,处理异常就变得十分难受了,Springmvc提供了一种全局异常处理机制,允许我们在一个类中集中处理异常,控制器不需理会异常。
实现异常处理方式一:
@ExceptionHandler({IOException.class,NullPointerException.class } ) public String excpetionHandle(){ return "error"; }
注解中的异常类型可以给 单个 或 多个
这种处理方式,比较局限,只能处理当前 Controller中的异常
实现全局异常处理方式一:
①实现 HandlerExceptionResolver 接口
//确保 AppGolablException 实例加入IOC容器中 可以用xml配置和注解配置 @Component public class AppGolablException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //这里无论什么异常都到 error 页面去 //当然这里可以根据实际的异常类型做 不同的响应 ModelAndView mv = new ModelAndView("error"); return mv; } }
②抛出异常
@RequestMapping("/ex") public String testex(){ throw new NullPointerException("hehe"); } @RequestMapping("/ex2") public String textex2() throws Exception{ throw new IOException("haha"); }
这时请求 ex 和 ex2 方法都会跳转到 error页面
实现全局异常处理方式二: @ControllerAdvice + @ExceptionHandler
①编写异常处理代码
@ControllerAdvice public class AppException { @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Exception.class) @ResponseBody public Object handleHttpMessageNotReadableException(Exception e) { System.out.println("------------"); return "50X"; } }
②控制器抛出异常
@RequestMapping("/ex") public String testex(){ throw new NullPointerException("hehe"); } @RequestMapping("/ex2") public String textex2() throws Exception{ throw new IOException("haha"); }