Spring MVC的interceptor拦截器拦截请求是通过实现HandlerInterceptor接口来完成的。
接来下举一个实例:
通过拦截器完成一个用户权限验证的功能—用户必须登录以后才能访问网站其他页面,如果没有登录就访问,则会被拦截器拦截,请求转发到登录页面并进行提示。
1.创建一个项目,导入相应的jar包,在web.xml中配置前端控制器。
2.编写一个实体类
private String username;
private String password;
3.编写一个controller
@Controller
public class UserController {
@RequestMapping(value="/{pagename}"
)
public String pageName(@PathVariable String pagename){
return pagename;
}
@RequestMapping("login"
)
public ModelAndView login(String username,String password
,ModelAndView mv,HttpSession session){
if(username!=
null&&username.equals("aaa")&&password!=
null&&password.equals("111"
)){
User user =
new User();
user.setUsername(username);
user.setPassword(password);
session.setAttribute("user"
, user);
mv.setViewName("success"
);
}else{
mv.addObject("message", "账号或密码错误"
);
mv.setViewName("loginPage"
);
}
return mv;
}
@RequestMapping("success"
)
public String success(){
return "success"
;
}
}
4.编写一个拦截器
public class UserInterceptor
implements HandlerInterceptor{
/**
* 该方法在整个请求完成后执行,主要用来清理资源
* 该方法只能在当前interceptor的preHandler方法的返回值是true时才会执行
*/
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
/**
* 该方法在Controller的方法调用后执行,在视图被渲染以前被调用,所以可以用来对ModelAndView对象进行操作
* 该方法只能在当前interceptor的preHandler方法的返回值是true时才会执行
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
}
/**
* 该方法在请求之前被调用
* 该方法返回为true时拦截器才会继续往下执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//用于判断用户是否登录
boolean flag =
false;
User user = (User) request.getSession().getAttribute("user"
);
if(user==
null){
request.setAttribute("message", "请先登录"
);
request.getRequestDispatcher("loginPage.jsp"
).forward(request, response);
}else{
flag =
true;
}
return flag;
}
}
5.配置springmvc-config.xml,在里面配置拦截器,配置拦截路径和不进行拦截的路径。
<!-- spring可以自动去扫描base-package下面的包或者子包下面的java类
如果扫描到有spring相关注解的类,则吧这个类注册为spring的bean
-->
<context:component-scan base-package="com.dj.controller"/>
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截路径 -->
<mvc:mapping path="/*"/>
<!-- 不拦截的路径 -->
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/loginPage"/>
<bean class="com.dj.interceptor.UserInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix">
<value>/
</value>
</property>
<!-- 后缀 -->
<property name="suffix">
<value>.jsp
</value>
</property>
</bean>
6.编写登录页面和显示登录成功的页面,显示登录成功的页面只有在登录后才能访问,如果没有登录就访问将会被拦截。
<form action="login" method="post">
<!-- 提示信息 -->
<font color="red">${requestScope.message }
</font><br>
用户名:<input type="text" name="username" /><br>
密码:<input type="password" name="password"/>
<input type="submit" value="登录"/>
</form>
<body>
登陆成功!
</body>
7.测试
直接访问success页面被拦截
访问登录页面,因为配置了不进行拦截的路径,所以显示如下
输入账号密码登录成功
源码下载路径 https://files.cnblogs.com/files/dj-blog/Interceptor.zip
转载于:https://www.cnblogs.com/dj-blog/p/7535835.html