Spring MVC中的拦截器
程序员文章站
2022-05-23 12:57:07
...
I.实现HandlerInterceptor接口
// 在请求处理的方法之前执行
// 返回true执行下一个拦截器,返回false不继续执行
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
boolean isUser = true;
System.out.println("-------处理前-------");
// 使用HttpServletRequest和HttpServletResponse实现拦截跳转
if (!isUser) {
// response.sendRedirect(request.getContextPath() + "/Index.jsp");
RequestDispatcher rd = request.getRequestDispatcher("/Index.jsp");
rd.forward(request, response);
}
return isUser;
}
II.配置拦截器
注意拦截器路径的配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- /**表示包括路径及其子路径
比如/admin/*表示/admin/add,/admin/list但不包括/admin/user/add
而/adimn/**则包括/admin/user/add
-->
<mvc:mapping path="/**"/>
<!-- 对应的拦截器 -->
<bean class="com.duxd.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
需要注意的是这里加入了
III.登录拦截
mvc.xml
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- /**表示包括路径及其子路径
比如/admin/*表示/admin/add,/admin/list但不包括/admin/user/add
而/adimn/**则包括/admin/user/add
-->
<mvc:mapping path="/**"/>
<!-- 对应的拦截器 -->
<bean class="com.duxd.interceptor.LoginInterceptor">
<property name="allowedPass">
<list>
<value>Login.do</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors>
LoginInterceptor // 找出哪些url不被拦截,哪些需要被拦截
private List<String> allowedPass;
// 要加入getter和setter方法,否则报错
public List<String> getAllowedPass() {
return allowedPass;
}
public void setAllowedPass(List<String> allowedPass) {
this.allowedPass = allowedPass;
}
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp,
Object handler) throws Exception {
String url = req.getRequestURL().toString();
String temp;
System.out.println(url);
// 输出了Login.do,是在mvc.xml里配置Interceptor时设置的value值,这里如果输入的url后缀为Login.do就返回true,否则返回false。
for(int i = 0; i < allowedPass.size(); i++) {
System.out.println(allowedPass.get(i));
}
Object user = req.getSession().getAttribute("user");
if(user != null) {
return true;
}
// for(String temp:allowedPass) {
// if(url.endsWith(temp)) {
// return true;
// }
// }
for(int i = 0; i < allowedPass.size(); i++) {
temp = allowedPass.get(i);
if(url.endsWith(temp)) {
return true;
}
}
resp.sendRedirect(req.getContextPath() + "/Login.jsp");
return false;
}
UserController@Controller
public class UserController {
@RequestMapping("/Login")
public String Login(User user, HttpSession session) {
System.out.println(user.getName() + "," + user.getPassword() + ";");
if(user.getName().equals("duxd") && user.getPassword().equals("123456")){
session.setAttribute("user", user);
return "redirect:/Index.jsp";
}
return "redirect:/Login.jsp";
}
// 这个由于不在allowedPass中,会被拦截器拦截,重定向到Login界面
@RequestMapping("/Add")
public String add() {
System.out.println("add");
return "redirect:/Login.jsp";
}
上一篇: MFC-创建多线程应用程序
推荐阅读
-
详解如何在低版本的Spring中快速实现类似自动配置的功能
-
自定义spring mvc的json视图实现思路解析
-
spring mvc利用ajax向controller传递对象的方法示例
-
spring mvc中直接注入的HttpServletRequst安全吗
-
Spring中如何获取request的方法汇总及其线程安全性分析
-
关于Spring MVC在Controller层中注入request的坑详解
-
spring aop action中验证用户登录状态的实例代码
-
解读ASP.NET 5 & MVC6系列教程(17):MVC中的其他新特性
-
Spring mvc整合tiles框架的简单入门教程(maven)
-
Spring MVC 404 Not Found无错误日志的解决方法