spring拦截器覆盖_springmvc学习笔记二:重定向,拦截器,参数绑定

Controller方法返回值

返回ModelAndView

controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

返回void

在Controller方法形参上可以定义request和response,使用request或response指定响应结果:

1、使用request转发页面,如下:

request.getRequestDispatcher("页面路径").forward(request, response)

request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

2、可以通过response页面重定向:

response.sendRedirect("url")

response.sendRedirect("/springmvc-web2/itemEdit.action");

3、可以通过response指定响应结果,例如响应json数据如下:

response.getWriter().print("{\"abc\":123}");

/**

* 返回void测试

*

* @param request

* @param response

* @throws Exception

*/

@RequestMapping("queryItem")

public void queryItem(HttpServletRequest request, HttpServletResponse response) throws Exception {

// 1 使用request进行转发

// request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,

// response);

// 2 使用response进行重定向到编辑页面

// response.sendRedirect("/springmvc-web2/itemEdit.action");

// 3 使用response直接显示

response.getWriter().print("{\"abc\":123}");

}

返回字符串

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp

return "itemList";

Redirect重定向

Contrller方法返回字符串可以重定向到一个url地址,如下商品修改提交后重定向到商品编辑页面。

/**

* 更新商品

*

* @param item

* @return

*/

@RequestMapping("updateItem")

public String updateItemById(Item item) {

// 更新商品

this.itemService.updateItemById(item);

// 修改商品成功后,重定向到商品编辑页面

// 重定向后浏览器地址栏变更为重定向的地址,

// 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失

// 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

return "redirect:/itemEdit.action?itemId=" + item.getId();

}

forward转发

Controller方法执行后继续执行另一个Controller方法。如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。

/**

* 更新商品

*

* @param item

* @return

*/

@RequestMapping("updateItem")

public String updateItemById(Item item) {

// 更新商品

this.itemService.updateItemById(item);

// 修改商品成功后,重定向到商品编辑页面

// 重定向后浏览器地址栏变更为重定向的地址,

// 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失

// 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

// return "redirect:/itemEdit.action?itemId=" + item.getId();

// 修改商品成功后,继续执行另一个方法

// 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,

// 转发并没有执行新的request和response,所以之前的请求参数都存在

return "forward:/itemEdit.action";

}

//结果转发到editItem.action,request可以带过去

return "forward: /itemEdit.action";

拦截器

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

拦截器定义

实现HandlerInterceptor接口,如下:

public class HandlerInterceptor1 implements HandlerInterceptor {

// controller执行后且视图返回后调用此方法

// 这里可得到执行controller时的异常信息

// 这里可记录操作日志

@Override

public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

throws Exception {

System.out.println("HandlerInterceptor1....afterCompletion");

}

// controller执行后但未返回视图前调用此方法

// 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示

@Override

public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

throws Exception {

System.out.println("HandlerInterceptor1....postHandle");

}

// Controller执行前调用此方法

// 返回true表示继续执行,返回false中止执行

// 这里可以加入登录校验、权限拦截等

@Override

public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {

System.out.println("HandlerInterceptor1....preHandle");

// 设置为true,测试使用

return true;

}

}

拦截器配置

上面定义的拦截器再复制一份HandlerInterceptor2,注意新的拦截器修改代码:System.out.println("HandlerInterceptor2....preHandle");

在springmvc.xml中配置拦截器

正常流程测试

浏览器访问地址:http://127.0.0.1:8080/springmvc-web2/itemList.action

运行流程

控制台打印:

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor2..postHandle..

HandlerInterceptor1..postHandle..

HandlerInterceptor2..afterCompletion..

HandlerInterceptor1..afterCompletion..

中断流程测试

浏览器访问地址:http://127.0.0.1:8080/springmvc-web2/itemList.action

运行流程:HandlerInterceptor1的preHandler方法返回false,HandlerInterceptor2返回true,运行流程如下:

HandlerInterceptor1..preHandle..

从日志看出第一个拦截器的preHandler方法返回false后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且Controller也不执行了。

HandlerInterceptor1的preHandler方法返回true,HandlerInterceptor2返回false,运行流程如下:

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor1..afterCompletion..

从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandler和afterCompletion没有执行,且controller也不执行了。

总结

preHandle按拦截器定义顺序调用

postHandler按拦截器定义逆序调用

afterCompletion按拦截器定义逆序调用

postHandler在拦截器链内所有拦截器返成功调用

afterCompletion只有preHandle返回true才调用

拦截器应用

处理流程

有一个登录页面,需要写一个Controller访问登录页面

登录页面有一提交表单的动作。需要在Controller中处理。

a) 判断用户名密码是否正确(在控制台打印)

b) 如果正确,向session中写入用户信息(写入用户名username)

c) 跳转到商品列表

拦截器

a) 拦截用户请求,判断用户是否登录(登录请求不能拦截)

b) 如果用户已经登录。放行

c) 如果用户未登录,跳转到登录页面。

1、编写登录jsp

pageEncoding="UTF-8"%>

Insert title here

用户名:

密码:

2、用户登陆Controller

@Controller

@RequestMapping("user")

public class UserController {

/**

* 跳转到登录页面

*

* @return

*/

@RequestMapping("toLogin")

public String toLogin() {

return "login";

}

/**

* 用户登录

*

* @param username

* @param password

* @param session

* @return

*/

@RequestMapping("login")

public String login(String username, String password, HttpSession session) {

// 校验用户登录

System.out.println(username);

System.out.println(password);

// 把用户名放到session中

session.setAttribute("username", username);

return "redirect:/item/itemList.action";

}

}

3、编写拦截器

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {

// 从request中获取session

HttpSession session = request.getSession();

// 从session中获取username

Object username = session.getAttribute("username");

// 判断username是否为null

if (username != null) {

// 如果不为空则放行

return true;

} else {

// 如果为空则跳转到登录页面

response.sendRedirect(request.getContextPath() + "/user/toLogin.action");

}

return false;

}

4、 配置拦截器

只能拦截商品的url,所以需要修改ItemController,让所有的请求都必须以item开头,如下图:

在springmvc.xml配置拦截器

转自:https://www.cnblogs.com/ginb/p/7350964.html

SpringMVC学习笔记三:拦截器

一:拦截器工作原理 类比Struts2的拦截器,通过拦截器可以实现在调用controller的方法前.后进行一些操作. 二:拦截器实现 1:实现拦截器类 实现HandlerInterceptor 接口 ...

SpringBoot学习笔记:自定义拦截器

SpringBoot学习笔记:自定义拦截器 快速开始 拦截器类似于过滤器,但是拦截器提供更精细的的控制能力,它可以在一个请求过程中的两个节点进行拦截: 在请求发送到Controller之前 在响应发送 ...

Struts2学习笔记04 之 拦截器

一.创建拦截器组件 1. 创建一个类,实现Interceptor接口,并实现intercept方法 2.注册拦截器 3.引用拦截器 二.拦截器栈 预置拦截器: 默认引用拦截器 拦截器调用顺序: Fil ...

springMVC学习笔记(二)-----注解和非注解入门小程序

最近一直在做一个电商的项目,周末加班,忙的都没有时间更新博客了.终于在上周五上线了,可以轻松几天了.闲话不扯淡了,继续谈谈springMvc的学习. 现在,用到SpringMvc的大部分使用全注解配置 ...

【Struts2学习笔记-6--】Struts2之拦截器

简单拦截器的使用 拦截器最基本的使用: 拦截方法的拦截器 拦截器的执行顺序 拦截结果的监听器-相当于 后拦截器 执行顺序: 覆盖拦截器栈里特定拦截器的参数 使用拦截器完成-权限控制 主要完成两个功能: ...

Struts2学习笔记(十)——自定义拦截器

Struts2拦截器是基于AOP思想实现的,而AOP的实现是基于动态代理.Struts2拦截器会在访问某个Action之前或者之后进行拦截,并且Struts2拦截器是可插拔的:Struts2拦截器栈就 ...

SpringMVC学习笔记二:常用注解

你可能感兴趣的:(spring拦截器覆盖)