SpringMVC--02(拦截器与过滤器)

1.拦截器

拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截!

除此以外,拦截器还会运行在Controller之后,关于拦截器,在处理某一个请求时,最多有3次执行!只不过,通常关注最多的是第1次执行,即在Controller之前的那次!

HandlerInterceptor三个方法: 
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.wx.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import sun.misc.Request;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {
   /**在请求处理之前进行调用。 */
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //登陆拦截判断
        String method = httpServletRequest.getMethod();
        //httpServletRequest.getRequestDispatcher("/login").forward(httpServletRequest,httpServletResponse);
        //重定向
        httpServletResponse.sendRedirect("/login");
        System.out.println(method);
        return false;
    }
    /**在请求处理之后进行调用。 */
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }
    /**整个请求结束之后(渲染了对应的视图之后)调用。*/
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

配置拦截器:拦截了index方法

 <!-- 配置拦截器链 -->
    <mvc:interceptors>
        <!-- 配置第1个拦截器 -->
        <mvc:interceptor>
            <!-- 指定拦截路径,不在拦截路径之内的将不予处理,即拦截器根本就不运行 -->
            <mvc:mapping path="/index"/>
            <mvc:mapping path="/user/password.do"/>
            <!-- 指定拦截器类 -->
            <bean class="com.wx.Interceptor.LoginInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>

测试:

package com.wx.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
public class InterceptorController {

    @GetMapping ("/login")
    public String login(){
        return "login";
    }
}

 访问index页面实现了跳转

2.异常处理

 在J2EE项目的开发中,每个异常都单独处理,系统的代码耦合度高,工作量大:

(1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResover

(2)实现Spring的异常处理接口HandlerExceptionResolver自定义的异常处理器

(3)使用@ExceptionHandler注解实现异常处理

 我们使用第二种方式来实现SpringMVC的异常处理

 首先自定义一个异常的类:

package com.wx.error;

public class MyException extends Exception {
    public MyException(String msg){
        super(msg);
    }
}

 实现异常处理类:

package com.wx.error;

import com.sun.glass.ui.View;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

public class CustomExceptionHandler implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        if (e instanceof IOException) {

            return new ModelAndView("error");
        } else if (e instanceof SQLException) {
            return new ModelAndView("error");
        } else if (e instanceof MyException) {
            modelAndView.addObject("msg", e.getMessage());
            modelAndView.setViewName("error");
            return modelAndView;
        }
        return null;
    }
}

SpringMvc的配置文件中加上bean注入:‘

 <!-- 自定义的实现类 -->
    <bean id="exceptionHandler" class="com.wx.error.CustomExceptionHandler"/>
    <!-- 默认的实现类注入 -->

 添加一个错误页:

测试:

package com.wx.controller;

import com.wx.error.MyException;
import com.wx.service.FilmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ExceptionController {
    @Autowired
    private FilmService filmService;
    @RequestMapping("/exception1")
    @ResponseBody
    public String exception1() throws Exception {
        System.out.println("alalaal");
        //当某种业务条件不满足的时候抛出异常
        boolean condition = true;
        if (condition) {
            MyException myException = new MyException("Controller层异常");
            throw myException;
        }
        return "string";
    }
    @RequestMapping("/exception2")
    @ResponseBody
    public String exception2() throws Exception {
        System.out.println("alalaal");
        //当某种业务条件不满足的时候抛出异常
        filmService.exception();
        return "string";
    }
}

 访问:http://localhost:8080/exception1

访问:http://localhost:8080/exception2

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值