本文介绍了springmvc中的转发重定向和拦截器的示例,分享给大家,具体如下:
可变参数在设计方法时,使用 数据类型...
来声明参数类型,例如: public static void function(int... numbers)
在实现方法体时,可变参数是作为数组来处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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,这个不会经过视图解析器,而是直接跳转
实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@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" ;
}
|
拦截器
基本概念
- 拦截器( interceptor )是springmvc中的一个 组件 ,是运行在 dispatcherservlet 之后,运行在 controller 之前的
- 拦截器可以决定对某些符合条件的进行 拦截 或者 放行 ,所以,通常用于对一些具有相同运行条件的功能进行约束
使用拦截器
自定义拦截器类
创建一个拦截类( demointerceptor ),实现 handlerinterceptor 接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
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的配置文件中配置
- 配置拦截的路径: <mvc:mapping path=""/> 可以使用通配符 * 比如: /** 匹配所有的路径, /user/* 只能匹配 /user 的子路径
- 配置不拦截的路径 : <mvc:exclude-mapping path=""/> 可以配置 多个
- 配置拦截器类( bean ) : <bean class="">
配置
必须按照上面的顺序配置,否则将会报错
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!-- 配置拦截器,其中可以配置多个拦截器 -->
<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)
- 该方法在 controller 处理请求之前执行
- 如果返回的 false ,则会中断处理流程,不会执行后续的拦截器和处理器,返回 true 会执行后续的拦截器和处理器
- 可以自行设计逻辑返回 false 或者 true
public void posthandle(httpservletrequest request,httpservletresponse response, object handler,modelandview modelandview)
- 处理器执行之后,视图处理之前调用,此时可以通过对 modelandview 对数据和视图进行处理
- 当然需要 prehandler 方法返回 true 才会执行
public void aftercompletion(httpservletrequest request,httpservletresponse response, object handler, exception ex)
- 所有的请求处理完毕之后调用,比如性能监控中,我们可以在此记录结束时间和消耗时间,还可以进行一些资源处理
- 当然需要 prehandler 方法返回 true 才会执行
演示登录检查
- 登录检查: 当涉及到用户信息的修改,查看什么的,必须要验证是否登录,因此需要设计拦截器验证登录
- 先设定登录数据,即: 在 login.jsp 中添加登录按钮,登录完成之后,需要自己定义一个标记存储在 session 中,比如 用户的id 或者 用户的对象
- 我们使用用户的 id 作为标记验证是否已经的登录,如果用户登录成功,会在 session 中添加一个 uid 的属性
- 用户退出登录使用 session.invalidate(); 清除 session ,并且重定向到 登录界面
自定义拦截器(logininterceptor)
具体流程在 prehandler 方法中写的很清楚
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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
1
2
3
4
5
6
7
|
<!-- 配置拦截器,其中可以配置多个拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mappingpath= "/user/user_center.do" />
<beanclass= "cn.tedu.spring.interceptor.logininterceptor" ></bean>
</mvc:interceptor>
</mvc:interceptors>
|
多个拦截器的执行顺序
根据在 springmvc 配置文件中配置的顺序执行,即是在 <mvc:interceptors> 下配置的拦截器的顺序,如果对同一个路径进行了拦截器,那么先配置的先拦截
拦截器和过滤器的区别(主要的区别)
- 拦截器是springmvc中,仅仅当使用 springmvc 才可以使用拦截器,过滤器是 java ee 体系中的,无论使用哪种框架都可以使用过滤器
- 拦截器在 dispatcherservlet 之后,在处理器之前执行,过滤器在 dispatcherservlet 之前执行
- 过滤器会在所有的 servlet 之前执行(所有的请求都会执行),而拦截器会在springmvc中 dispatcherservlet 之后执行,所以过滤器在项目中可以过滤任何请求(只要是配置了对应的路径),而拦截器只会在 dispatcherservlet 处理的请求的基础之上进行拦截
总结
当多种请求都需要做相同或者极为相似的任务时,可以使用拦截器
开发好拦截器,那么需要在 springmvc 的配置文件中配置
在 <mvc:interceptors> 可以有如果若干个 <mvc:interceptor> ,即是配置若干个拦截器,配置的多个拦截器将会形成 拦截器链 ,如果配置多个拦截器对同一个路径都会拦截,那么会按照配置的节点顺序执行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://chenjiabing666.github.io/2018/05/09/Springmvc中的转发重定向和拦截器