拦截器

1. 使用过滤器解决表单中文参数值乱码问题

注意:
a. 表单提交方式必须为POST。
b. 过滤器的编码应该与浏览器端设置的编码一致。

2. 拦截器

(1)什么是拦截器?

spring框架当中的一种特殊的组件,当前端控制器(DispatcherServlet)调用处理器(Controller)之前,会先调用拦截器,然后再调用处理器。
注:
过滤器属于Servlet规范当中定义的组件,而拦截器属于Spring框架 当中定义的组件。

(2)如何写一个拦截器?

step1. 写一个java类,实现HandlerInterceptor接口。
step2. 在接口方法当中,实现拦截处理逻辑。


step3. 配置拦截器。

代码如下:

控制器:

package controller;

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

@Controller
public class HelloController {
	
	@RequestMapping("/hello.do")
	public String hello(){
		System.out.println("hello()");
		return "hello";
	}
	
	@RequestMapping("/demo/hello2.do")
	/**
	 * http://localhost:8080/springmvc03/demo/hello2.do
	 * 此处请求并没有拦截
	 * 拦截分层的要两个*:/**
	 */
	public String hello2(){
		System.out.println("hello2()");
		return "hello";
	}
	
}

拦截器:

package interceptors;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class SomeInterceptor implements HandlerInterceptor{

	/**
	 * DispatcherServlet收到请求后,会先调用preHandle方法
	 * 若该方法返回true,则继续向后调用(拦截器或处理器)
	 * 若返回值为false,则不再向后调用,返回处理结果
	 * 第三个参数:处理器方法对象(一般不使用),可以获得处理器的方法名称返回值类型等
	 */
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("preHandle()");
		return true;
	}

	/**
	 * 处理器(Controller)的方法已经执行完毕,正准备将处理结果(ModelAndView)
	 * 返回给DisparcherServlet之前执行postHandle方法。
	 * 可以用于修改处理结果(数据、视图名)
	 * 第四个参数:处理器返回的结果对象
	 */
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle()");
	}

	/**
	 * 最后执行的方法,整个请求处理完毕后调用
	 * 注意:只有当preHandle返回值为true时,该方法才会执行
	 * 第四个参数:处理器所抛出的异常(可以用拦截器来处理处理器所抛出的异常)
	 */
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion()");
	}

}

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" 
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"  
	xmlns:jee="http://www.springframework.org/schema/jee" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:jpa="http://www.springframework.org/schema/data/jpa"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
		http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
		http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
	
	<!-- 组件扫描对@Component @Service @Repository @Controller这四个有效  -->
	<context:component-scan base-package="controller"></context:component-scan>
	
	<!-- 配置springmvc注解扫描(spring3.2版本以后使用此配置,之前版本配置有所不同)对@RequestMapping有效 -->
	<mvc:annotation-driven></mvc:annotation-driven>
	
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	  <property name="prefix" value="/WEB-INF/"></property>
	  <property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- 配置拦截器 多个拦截器时候按顺序执行-->
	<mvc:interceptors>
	  <mvc:interceptor>
	    <!-- 拦截的请求 请求有多层时,写两个*-->
	    <mvc:mapping path="/**"/>
	    <!-- <mvc:exclude-mapping path=""/> 不拦截的请求-->
	    <bean class="interceptors.SomeInterceptor"></bean>
	  </mvc:interceptor>
	</mvc:interceptors>
	
</beans>

测试请求:http://localhost:8080/springmvc03/demo/hello2.do

控制台输出结果:

preHandle()
hello2()
postHandle()
afterCompletion()
==============================================================

在之前的案例登陆中,配置拦截器,添加代码如下:

1.在登录的controller中,将admin存入session

@RequestMapping("/login.do")
	//登录成功-重定向到首页
	public String login(HttpServletRequest request, HttpSession session){
		//jsp页面采用的是post提交 可以使用以下编码,预防中文乱码
		//request.setCharacterEncoding("UTF-8");
		String adminCode = request.getParameter("adminCode");//账号
		String pwd = request.getParameter("pwd");//账号
		System.out.println(adminCode + " " + pwd);
		//调用业务层服务--此处要处理异常
		try{
			Admin admin = service.checkLogin(adminCode, pwd);
			//把admin对象绑定到session,用于session验证(位于拦截器)
			session.setAttribute("admin", admin);
		}catch(Exception e){
			e.printStackTrace();
			//此处有两种异常需要处理
			if(e instanceof ApplicationException){
				//应用异常,提示用户采取正确的操作
				request.setAttribute("login_failed", e.getMessage());
				return "login";//登录页面
			}
			//系统异常(例如数据库异常、断网) 提示用户稍后重试
			return "error";//错误页面
		}
		return "redirect:toIndex.do";
	}

2.配置拦截器,拦截哪些路径,不拦截哪些路径

<!-- 配置拦截器 多个拦截器时候按顺序执行-->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- 拦截的请求 请求有多层时(/demo/abc/hello.do),写两个*-->
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path="/toLogin.do"/><!-- 不拦截的请求 -->
			<mvc:exclude-mapping path="/login.do"/><!-- 不拦截的请求 -->
			<bean class="com.tarena.netctoss.interceptors.SessionInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

3.写拦截器类

package com.tarena.netctoss.interceptors;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 用于session验证的拦截器
 */
public class SessionInterceptor implements HandlerInterceptor{

	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		HttpSession session = request.getSession();
		Object obj = session.getAttribute("admin");
		if(obj == null){
			//未登录 或 超时,重定向到登录页面
			response.sendRedirect("toLogin.do");
			return false;
		}
		//已经登陆过,允许访问
		return true;
	}

	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
	}

	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荒--

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

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

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

打赏作者

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

抵扣说明:

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

余额充值