SpringMVC(十三)----拦截器

本文介绍了如何在SpringMVC中实现拦截器进行权限验证,详细讲解了从创建拦截器、配置springmvc.xml到实现登录权限验证的全过程。在登录验证中,拦截器会检查session中的登录信息,未登录时跳转到登录页面,登录成功后将信息存入session。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本使用

1.创建拦截器

package com.ken.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Interceptor1 implements HandlerInterceptor {

	//执行时机:controller方法已经执行,ModelAndView已经返回
	//使用场景:记录操作日志,记录登录用户的ip,时间等
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("====================Interceptor1 afterCompletion====================");
	}

	//执行时机:controller方法已经执行,ModelAndView没有返回
	//使用场景:可以在此方法中设置全局的数据处理业务
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("====================Interceptor1 postHandle====================");
	}

	//返回布尔值:如果返回true,放行;返回false,被拦截
	//执行时机:controller方法没有被执行,ModelAndView没有被返回
	//使用场景:权限验证
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		System.out.println("====================Interceptor1 preHandle====================");
		return true;
	}
}

2.配置springmvc.xml

<!-- 配置拦截器 -->
<mvc:interceptors>
	<!-- 多个拦截器的执行顺序等于springmvc.xml中的配置顺序 -->
	<mvc:interceptor>
		<!-- 拦截请求的路径 要拦截所有,必须配成/** -->
		<mvc:mapping path="/**" />
		<!-- 指定拦截器的位置 -->
		<bean class="com.ken.interceptor.Interceptor1" />
	</mvc:interceptor>
	<mvc:interceptor>
		<!-- 拦截请求的路径 要拦截所有,必须配成/** -->
		<mvc:mapping path="/**" />
		<!-- 指定拦截器的位置 -->
		<bean class="com.ken.interceptor.Interceptor2" />
	</mvc:interceptor>
</mvc:interceptors>

二、权限验证

登录权限验证:
1)编写登录的controller, 编写跳转到登录页面的方法,  编写登录验证方法
2)编写登录页面
3)编写拦截器
运行过程:
1)访问随意一个页面,拦截器会拦截请求,会验证session中是否有登录信息
如果已登录,放行
如果未登录,跳转到登录页面
2)在登录页面中输入用户名,密码,点击登录按钮,拦截器会拦截请求,如果是登录路径放行
在controller方法中判断用户名密码是否正确,如果正确则将登录信息放入session

1.登录页面

<%@ page language="java" contentType="text/html; charset=UTF-16"
    pageEncoding="UTF-16"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-16">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/login/submit" method="post">
	<table>
		<tr>
			<td>用户名:<input name="username" type="text"/></td>
		</tr>
		<tr>
			<td>密码:<input name="password" type="password"/></td>
		</tr>
		<tr>
			<td>密码:<input value="登录" type="submit"/></td>
		</tr>
	</table>
</form>
</body>
</html>

2.controller

@Controller
@RequestMapping("/login")
public class LoginController {

	// 跳转到登录页面
	@RequestMapping("/login")
	public String login() {
		return "login";
	}

	@RequestMapping("/submit")
	public String submit(String username, String password, HttpServletRequest request) {
		HttpSession session = request.getSession();
		// 判断用户密码的正确性,如果正确则将登录信息放入session中
		// 这里简写,真正项目中需要去数据库中校验用户名和密码
		if (username != null) {
			session.setAttribute("username", username);
		}
		
		// 跳转到列表页
		return "redirect:/items/list";
	}
}

3.拦截器

public class LoginInterceptor implements HandlerInterceptor{

	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
		//判断当前访问路径是否为登录的路径,如果是则放行
		if(request.getRequestURI().indexOf("/login") > 0){
			return true;
		}
		//判断session中是否有登录信息,如果没有则跳转到登录页面,如果有则放行
		HttpSession session = request.getSession();
		if(session.getAttribute("username")!=null){
			return true;
		}
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);;
		return false;
	}
}

拦截器要在springmvc.xml中注册

源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值