【Spring MVC】教程——使用拦截器实现权限控制

之前一直都在用mvc的拦截器权限控制,后来上网也研究了一些这方面的知识,下面就直接分享下我对mvc的拦截器的理解,通过项目来分析吧。。。

1、首先准备对应的架包


2、看看项目的架构


3、基本的web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<display-name>shiro</display-name>

	<!-- 加载springmvc -->
	<servlet>
		<servlet-name>SpringMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- 以.htm结尾的都被mvc拦截 -->
	<servlet-mapping>
		<servlet-name>SpringMVC</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>
	
	<!-- 启动spring 加载   需要加载其他的spring时 需启动该监听器
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	 -->
</web-app>

3、配置classpath下的mvc.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.0.xsd 
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
	<mvc:annotation-driven />
	<!-- 自动扫描包 -->
	<context:component-scan base-package="com.cat.spring.controller" />

	<!--  配置mvc的拦截器 可以配置多个 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!--  需要被拦截的路径 -->
			<mvc:mapping path="/member/**" />
			<!-- 拦截处理的interceptor -->
			<bean class="com.cat.interceptor.MemberInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

	<!-- mvc返回页面的配置 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 模板路径为WEB-INF/pages/ -->
		<property name="prefix">
			<value>/WEB-INF/pages/</value>
		</property>
		<!-- 视图模板后缀为.JSP -->
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

</beans>

4、接着就要配置拦截器了MemberInterceptor.java

/**
 * 
 */
package com.cat.interceptor;

import java.net.URLEncoder;

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

import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author chenlf
 * 
 *         2014-3-25
 */
public class MemberInterceptor implements HandlerInterceptor {

	public final static String SEESION_MEMBER = "seesion_member";

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest,
	 * javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
	 */
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
			Exception arg3) throws Exception {
		// TODO Auto-generated method stub

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest,
	 * javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.web.servlet.ModelAndView)
	 */
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
			ModelAndView arg3) throws Exception {
		// TODO Auto-generated method stub

	}

	/*
	 * (non-Javadoc)
	 * 拦截mvc.xml配置的/member/**路径的请求
	 * @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest,
	 * javax.servlet.http.HttpServletResponse, java.lang.Object)
	 */
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object handler) throws Exception {
		//请求的路径
		String contextPath=request.getContextPath();
		String	url=request.getServletPath().toString();
		HttpSession session = request.getSession();
		String user = (String) session.getAttribute(SEESION_MEMBER);
		//这里可以根据session的用户来判断角色的权限,根据权限来重定向不同的页面,简单起见,这里只是做了一个重定向
		if (StringUtils.isEmpty(user)) {
			//被拦截,重定向到login界面
			response.sendRedirect(contextPath+"/login.htm?redirectURL="
					+ URLEncoder.encode(url));
			return false;
		}
		return true;
	}

}
这样拦截器的核心就配置完了,接下来就是一些登陆的处理操作

5、LoginController.java文件

/**
 * 
 */
package com.cat.spring.controller;

import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.cat.interceptor.MemberInterceptor;

/**
 * @author chenlf
 * 
 *         2014-3-24
 */
@Controller
public class LoginController {

	@RequestMapping(value = "/login", method = RequestMethod.GET)
	public ModelAndView login(String redirectURL, HttpServletRequest request) {
		ModelAndView view = new ModelAndView();
		//把拦截前路径存下来,以便登入成功可以直接请求到登录前的页面
		view.addObject("redirectURL", redirectURL);
		view.setViewName("/login");
		return view;
	}

	@RequestMapping(value = "/submit", method = RequestMethod.POST)
	public String submit(String username, String password, String redirectURL,
			HttpServletRequest request) {
		//模拟登陆成功 用户admin 密码admin的用户
		if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)
				&& username.equals("admin") && password.equals("admin")) {
			//当登陆成功是,将用户信息存放到session中去
			HttpSession session = request.getSession();
			session.setAttribute(MemberInterceptor.SEESION_MEMBER, "admin");
			if (StringUtils.isNotBlank(redirectURL)) {
				return "redirect:" + URLDecoder.decode(redirectURL);
			}
			return "redirect:/member/index.htm";
		} else {
			if (StringUtils.isNotBlank(redirectURL)) {
				return "redirect:/login.htm?" + URLDecoder.decode(redirectURL);
			}
			return "redirect:/login.htm";
		}
	}
}

6、下面就是login.jsp文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>mvc权限登陆login</title>
	</head>
	<body>
		<h3>
			mvc权限登陆login
		</h3>
		<form action="submit.htm" method="post">
			<!-- 记录重定向的url -->
			<input type="hidden" name="redirectURL" value="${redirectURL}" />
			<table>
				<tr>
					<td>
						账号
					</td>
					<td>
						<input type="text" name="username" />
					</td>
					<td>
						密码
					</td>
					<td>
						<input type="password" name="password" />
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<input type="submit" value="提交" />
					</td>
				</tr>
			</table>
		</form>
	</body>
</html>

7、剩下的就是一些正常的mvc请求处理的文件,这里就不赘诉了

8、到这里看看效果吧

a、当非登陆状态的时候,请求localhost:8010/demo-mvc/member/list.htm时,被拦截拦截,重定向到login页面,并携带了当前的这个路径(/member/list.htm)作为参数传到页面

b、输入正确的用户名admin 密码admin后登陆,会跳转到拦截前的页面

c、当登陆完成后,输入地址为http://localhost:8010/demo-mvc/member/index.htm,session中记录着当前用户的信息,不需要重新登陆了

9、因为篇幅问题,一些不重要的文件没有一一贴出来,有需要的可以到http://download.csdn.net/detail/a124753561/7098925下载源代码。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring MVC提供的拦截器可以用于实现授权验证和权限管理,具体实现步骤如下: 1. 创建一个实现HandlerInterceptor接口的拦截器类,该类需要实现preHandle方法。 2. 在preHandle方法中,可以进行授权验证的逻辑判断,比如检查用户是否登录或者是否具有特定的权限。 3. 如果验证失败,可以通过return false的方式中止请求的处理流程,返回相应的错误信息给用户。 4. 如果验证成功,可以继续处理请求的流程,并在需要的地方通过request对象获得用户的相关信息。 5. 还可以在preHandle方法中,通过response对象对非法请求进行拦截和处理。 通过以上几个步骤,我们可以实现授权验证和权限管理的功能。例如,在一个需要登录才能访问的资源上配置该拦截器,当用户发起请求时,拦截器会首先验证用户是否登录,如果没有登录,则中止请求的继续处理,返回一个登录页面;如果用户已经登录,则继续处理请求,并根据用户的权限进行相应的权限检查。如果权限检查不通过,则同样返回错误信息给用户。 总之,Spring MVC提供的拦截器可以很方便地实现授权验证和权限管理的功能,通过控制请求的流程,可以有效地保护系统的安全性和可靠性。这样的设计模式使得开发者能够更加灵活地进行权限控制,并能够根据实际需求进行定制化的权限管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值