Springmvc中的转发重定向和拦截器的示例

本文介绍了Springmvc中的转发重定向和拦截器的示例,分享给大家,具体如下:

可变参数在设计方法时,使用 数据类型... 来声明参数类型,例如: public static void function(int... numbers)

在实现方法体时,可变参数是作为数组来处理

public class Test{

 public static void main(String[] args){
 System.out.println(Test.sum(1,2,3));
 System.out.println(Test.sum(1,2,3,4,54));
 }

 public static int sum(int... numbers){
 int sum=0;

 for(int i=0;i<numbers.length;i++){
  sum+=numbers[i];
 }
 return sum;
 }
}

注意:每个方法中,最多只允许存在1个可变参数,并且,如果存在 可变参数 ,那么必须是最后一个参数

转发和重定向

在控制器内部处理请求的方法中,默认返回字符串时的处理方式是 转发 ,转发的值是 view 组件的名称,比如 return "login" ,实质上会根据视图解析器( ViewResolver )得到最终负责显示的页面,而通过 return redirect:路径 这样的语法表示重定向,在 redirect: 右侧的内容是路径,这个路径通常使用相对的路径,是以当前客户端的地址栏中的路径为标准进行参考,例如当前的地址为: http://localhost:8080/Project/user/reg.do ,然后 return "redirect:login.do" ,则会重定向到 http://localhost:8080/Project/user/login.do ,如果 return "redirect:/main/index.do" 或者 return "redirect:../main/index.do" ,则会重定向到 http://localhost:8080/Project/main/index.do

forward:

默认的方式,但是也是可以使用 return "forward:login"
返回的一定是一个 view ,经过视图解析器之后会转发到指定的视图

redirect:

重定向 : return "redirect:login.do"
返回的是一个Controller方法的路径,而不是一个view,这个不会经过视图解析器,而是直接跳转

实例

@RequestMapping(value="/handle_reg.do", method=RequestMethod.POST)
 public String handleReg(User user,ModelMap map){
 try {
  userService.reg(user);
  System.out.println("注册成功!");
  return "redirect:login.do"; //重定向到login.do这个控制方法,login.do对应的就是转发到login.jsp
 } catch (UsernameConflictException e) {
  System.out.println(e.getMessage());
  map.put("errorMessage", e.getMessage());
  return "error";
 }
 }

 @RequestMapping(value="login.do")
 public String handleLogin(){
 return "login";
 }

拦截器

基本概念

  1. 拦截器( interceptor )是springmvc中的一个 组件 ,是运行在 DispatcherServlet 之后,运行在 Controller 之前的
  2. 拦截器可以决定对某些符合条件的进行 拦截 或者 放行 ,所以,通常用于对一些具有相同运行条件的功能进行约束

使用拦截器

自定义拦截器类

创建一个拦截类( DemoInterceptor ),实现 HandlerInterceptor 接口

public class DemoInterceptorimplements HandlerInterceptor{

 /**
 * 处理器执行之前调用
 * @param request HttpServletRequest对象,可以获取请求参数等等
 * @param response HttpServletResponse对象
 * @param Handler 拦截器的Controller对象
 * @return 如果返回false,就会中断处理流程,不会处理后续的拦截器和Controller。如果返回true,则会执行后续的拦截器和处理器
 */
 public boolean preHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler) throws Exception {

 System.out.println("DemoInterceptor的PreHandler执行");
 return true;
 }

 /**
 * 处理器执行之后调用,跳转到指定视图之前调用
 * @param request HttpServletRequest对象
 * @param response HttpServletResponse对象
 * @param Handler 拦截器的Controller对象
 * @param modelAndView ModelAndView对象,其中存放的是处理结果和视图的信息
 */
 public void postHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler,
  ModelAndView modelAndView) throws Exception {
 /**
  * 1. 可以自己设计逻辑,例如某些情况下返回false,返回true
  * 2. 返回true表示执行后续的处理器和拦截器,返回false会中断处理流程
  */
 System.out.println("handler:"+handler);
 System.out.println("DemoInterceptor的PostHandler执行");
 //设置视图的名称,那么执行完成之后就会条跳转到index.jsp页面
 //modelAndView.setViewName("index");
 }

 /**
 * 请求处理完成之后调用
 */
 public void afterCompletion(HttpServletRequest request,
  HttpServletResponse response, Object handler, Exception ex)
  throws Exception {
 System.out.println("DemoInterceptor的afterCompletion执行");

 }
}

在springmvc的配置文件中配置

  1. 配置拦截的路径: <mvc:mapping path=""/> 可以使用通配符 * 比如: /** 匹配所有的路径, /user/* 只能匹配 /user 的子路径
  2. 配置不拦截的路径 : <mvc:exclude-mapping path=""/> 可以配置 多个
  3. 配置拦截器类( bean ) : <bean class="">

配置

必须按照上面的顺序配置,否则将会报错

<!-- 配置拦截器,其中可以配置多个拦截器 -->
<mvc:interceptors>

 <mvc:interceptor>
 <!-- 配置拦截器的拦截路径,拦截/user下的全部处理器方法映射
  比如:http://localhost:8080/Springmvc/user/login.do这个请求就会被拦截
  -->
 <mvc:mappingpath="/user/*"/>

 <!-- 配置不被该拦截器拦截器的controller方法,这个是可选配置
  比如:http://localhost:8080/Springmvc/user/index.do将不会被拦截器
 -->
 <mvc:exclude-mappingpath="/user/index.do"/>
      <mvc:exclude-mappingpath="/user/login.do"/> 

 <!-- 配置拦截器的bean,指定的是全类名 -->
 <beanclass="cn.tedu.spring.interceptor.DemoInterceptor"></bean>
 </mvc:interceptor>
</mvc:interceptors>

其中实现的方法

public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler)

  1. 该方法在 controller 处理请求之前执行
  2. 如果返回的 false ,则会中断处理流程,不会执行后续的拦截器和处理器,返回 true 会执行后续的拦截器和处理器
  3. 可以自行设计逻辑返回 false 或者 true

public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView)

  1. 处理器执行之后,视图处理之前调用,此时可以通过对 ModelAndView 对数据和视图进行处理
  2. 当然需要 prehandler 方法返回 true 才会执行

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

  1. 所有的请求处理完毕之后调用,比如性能监控中,我们可以在此记录结束时间和消耗时间,还可以进行一些资源处理
  2. 当然需要 prehandler 方法返回 true 才会执行

演示登录检查

  1. 登录检查: 当涉及到用户信息的修改,查看什么的,必须要验证是否登录,因此需要设计拦截器验证登录
  2. 先设定登录数据,即: 在 login.jsp 中添加登录按钮,登录完成之后,需要自己定义一个标记存储在 session 中,比如 用户的id 或者 用户的对象
  3. 我们使用用户的 id 作为标记验证是否已经的登录,如果用户登录成功,会在 session 中添加一个 uid 的属性
  4. 用户退出登录使用 session.invalidate(); 清除 session ,并且重定向到 登录界面

自定义拦截器(LoginInterceptor)

具体流程在 prehandler 方法中写的很清楚

public class LoginInterceptorimplements HandlerInterceptor{
 /*
 * 在处理器执行之前调用(non-Javadoc)
 * 1. 获取session
 * 2. 读取session中的uid的值
 *  如果为null,表示没有登录,那么直接重定向到登录界面,同时返回false,不需要执行后面的流程了
 *  如果不为null,表示已经登录了,那么直接返回true,继续执行后面的拦截器或者处理器
 */
 public boolean preHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler) throws Exception {
 HttpSession session=request.getSession();  //获取session
 Object uid=session.getAttribute("uid"); //读取session中的对象
 //如果uid存在,那么即可登录完成
 if (uid!=null) {
  return true;  //返回true,登录成功就需要执行后续的流程
 }
 response.sendRedirect(request.getContextPath()+"/user/login.do"); //重定向到登录界面
 return false;  //返回false,后面的流程也不用执行了,直接中断
 }

 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 {

 }
}

springmvc中配置拦截器

由于这里只是跳转到用户中心需要验证登录,那么只是匹配了 user_center.do

<!-- 配置拦截器,其中可以配置多个拦截器 -->
 <mvc:interceptors>
 <mvc:interceptor>
  <mvc:mappingpath="/user/user_center.do"/>
  <beanclass="cn.tedu.spring.interceptor.LoginInterceptor"></bean>
 </mvc:interceptor>
 </mvc:interceptors>

多个拦截器的执行顺序

根据在 springmvc 配置文件中配置的顺序执行,即是在 <mvc:interceptors> 下配置的拦截器的顺序,如果对同一个路径进行了拦截器,那么先配置的先拦截

拦截器和过滤器的区别(主要的区别)

  1. 拦截器是springmvc中,仅仅当使用 springmvc 才可以使用拦截器,过滤器是 Java EE 体系中的,无论使用哪种框架都可以使用过滤器
  2. 拦截器在 DispatcherServlet 之后,在处理器之前执行,过滤器在 DispatcherServlet 之前执行
  3. 过滤器会在所有的 servlet 之前执行(所有的请求都会执行),而拦截器会在springmvc中 DispatcherServlet 之后执行,所以过滤器在项目中可以过滤任何请求(只要是配置了对应的路径),而拦截器只会在 DispatcherServlet 处理的请求的基础之上进行拦截

总结

当多种请求都需要做相同或者极为相似的任务时,可以使用拦截器

开发好拦截器,那么需要在 springmvc 的配置文件中配置

在 <mvc:interceptors> 可以有如果若干个 <mvc:interceptor> ,即是配置若干个拦截器,配置的多个拦截器将会形成 拦截器链 ,如果配置多个拦截器对同一个路径都会拦截,那么会按照配置的节点顺序执行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring MVC实现的登录拦截器代码分享

    之前接触过struts拦截器,但是没有使用过Spring MVC拦截器,今天花了一天时间好好研究了一下. 本文首先介绍了拦截器的基本概念,然后向大家阐述拦截器与过滤器的简要区别,通过HandlerInterceptor 接口中定义的三个方法实现拦截器功能,最后介绍了配置相关的代码,接下来看看具体内容. 定义拦截器 SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的.在SpringMVC 中定义一个Interceptor 非常简单,主要有两

  • springMVC拦截器HandlerInterceptor用法代码示例

    摘要:很多时候我们都会去修改其他同事的bug,甚至是已经离职的同事的bug,有时候我们点击页面去不着到后台对应的是哪个controller,针对这个问题,其实我们可以通过sprngmvc的拦截器来拦击用户的请求从而知道页面请求的是哪个class的哪个方法,当然这些打印日志信息肯能并不适合放在生产环境,或者这个拦截器也是非必要的.... 一.HandlerInterceptor用法 第一步:注册拦截器 <!-- 注册拦截器 --> <mvc:interceptors> <bea

  • SpringMVC拦截器实现监听session是否过期详解

    本文主要向大家介绍了SpringMVC拦截器实现:当用户访问网站资源时,监听session是否过期的代码,具体如下: 一.拦截器配置 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/user/login"/> <!-- 不拦截登录请求 --> <mvc:exclude-

  • 简单谈谈SpringMVC转发和重定向的区别

    在servlet中,转发和重定向是由request和response完成的.两者之间的区别请看我之前的文章.那么在springMVC中是如何完成的呢? /**转发**/ @RequestMapping("/login.do") public String login(HttpServletRequest request,HttpServletResponse response){ request.setAttribute("message", "hello

  • springmvc用于方法鉴权的注解拦截器的解决方案代码

    最近在用SpringMvc写项目的时候,遇到一个问题,就是方法的鉴权问题,这个问题弄了一天了终于解决了,下面看下解决方法 项目需求:需要鉴权的地方,我只需要打个标签即可,比如只有用户登录才可以进行的操作,一般情况下我们会在执行方法时先对用户的身份进项校验,这样无形中增加了非常大的工作量,重复造轮子,有了java注解只需要在需要鉴权的方法上面打个标签即可: 解决方案: 1.首先创建一个注解类: @Documented @Inherited @Target({ElementType.METHOD,E

  • springmvc限流拦截器的示例代码

    限流器算法 目前常用限流器算法为两种:令牌桶算法和漏桶算法,主要区别在于:漏桶算法能够强行限制请求速率,平滑突发请求,而令牌桶算法在限定平均速率的情况下,允许一定量的突发请求 下面是从网上找到的两张算法图示,就很容易区分这两种算法的特性了 漏桶算法 令牌桶算法 针对接口来说,一般会允许处理一定量突发请求,只要求限制平均速率,所以令牌桶算法更加常见. 令牌桶算法工具RateLimiter 目前本人常用的令牌桶算法实现类当属google guava的RateLimiter,guava不仅实现了令牌桶

  • SpringMVC中的拦截器详解及代码示例

    本文研究的主要是SpringMVC中的拦截器的介绍及实例代码,配置等内容,具体如下. Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: /

  • SpringMVC拦截器实现单点登录

    单点登录的功能在实际的应用场景中还是很重要的,逻辑上我们也不允许一个用户同时在进行着两个操作,下面就来了解一下SpringMVC的单点登录实现 SpringMVC的拦截器不同于Spring的拦截器,SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet,所以只需要在DispatcherServlet上做文章即可,DispatcherServlet也没有代理,同时SpringMVC管理的Controller也不有代理. 1,先探究一个

  • 防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml) <mvc:resources location="/" mapping="/**/*.js"/> <mvc:resources location="/" mapping=&quo

  • 详解spring mvc 请求转发和重定向

    请求重定向与请求转发的比较,HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有很大的区别. 1.RequestDispatcher.forward方法只能将请求转发给同一个Web应用中的组件,HttpServletResponse.sendRedirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序的资源,甚至是使用绝对

随机推荐