从零开始学SSM之SpringMVC拦截器-实现用户登录权限的控制

从零开始学SSM之SpringMVC拦截器-实现用户登录权限的控制



前言

拦截器的作用是在请求处理方法前,执行拦截器中的prehandle()方法,这样可以预先处理一些事务,
如判断一个用户是否已登录一个网站,如果已经登录,可直接进入网站;如果没有登录,则转发到登录页面。下面是一个通过拦截器完成用户登录权限验证的实例。


一、实验思路

当用户访问系统所有资源进行权限的验证,如果是已登录的用户,可直接进入相应的请求处理方法;如果是未登录的用户,则重定向到登录页面。

二、实验步骤

1、编写User类

User代码如下:

package com.po;

public class User {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	

}

2、编写控制器类

控制器代码如下:

package com.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.po.User;

// 处理用户请求的控制器
@Controller
//响应所有userInterceptor路径下的处理请求
@RequestMapping(value = "/userInterceptor")
public class UserController1 {
	@GetMapping(value = "/login.do")
	public String login() {
		return "login";
	}
//	这是处理用户登录的方法,响应userInterceptor/login.do的处理请求
	@PostMapping(value = "/login.do")
	public String login(User user,Model model,HttpSession session) {
		String msg;
		if(user.getUsername()!=null&&user.getUsername().equals("1")
				&&user.getPassword()!=null&&user.getPassword().equals("123"))
		{
			msg="登录成功";
			model.addAttribute("user",user);
			session.setAttribute("user", user);
			return "main";
		}
		else {
			msg="登录失败";
			model.addAttribute("msg",msg);
			return "login";
		}
		
		
		
	}
	
	@RequestMapping(value = "/main.do")
	public String main() {
		return "main";
	}
	@GetMapping(value = "/logout.do")
	public String logout(HttpSession session) {
		session.invalidate();
		return "redirect:/userInterceptor/login.do";
	}
}

2、编写拦截器类,决定哪些请求是允许的,哪些请求是非法的并加以拒绝

拦截器代码如下:

package com.interceptor;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.po.User;

public class LoginInterceptor implements HandlerInterceptor{
	// 进入Handler()方法之前执行
	// 可用于身份认证、身份授权。如果认证没有通过,表示用户没有登录,需要此方法拦截不再往下执行,否则就放行
	@Override
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler)
	throws Exception{
		// 获取请求的 url
		String url=request.getRequestURI();
		// 判断url是否公开地址(实际使用时将公开地址配置到配置文件中)
		// 这里假设公开地址是登录提交的地址
		if (url.indexOf("login.do") > 0) {
			// 如果进行登录提交,放行
			return true;
		}
		// 判断 session
		HttpSession session=request.getSession();
		// 从Session中取出用户身份信息
		User user=(User)session.getAttribute("user");
		if (user != null) {// 如果用户存在,表示已经登录,放行
			return true;
		}
		// 执行到这里表示用户身份需要验证,跳转回登录页面
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
		return false;
	}
}

3、在springmvc-config.xml中配置自定义的拦截器

springmvc-config代码如下:

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	   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"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans
	   http://www.springframework.org/schema/beans/spring-beans.xsd
	   http://www.springframework.org/schema/context 
  http://www.springframework.org/schema/context/spring-context.xsd
  http://www.springframework.org/schema/mvc
  https://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <!-- http://www.springframework.org/schema/mvc
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        https://www.springframework.org/schema/mvc/spring-mvc.xsd -->
		
		<!-- 指定需要扫描的包 -->
		<context:component-scan base-package="com.controller" />
		<!-- <mvc:annotation-driven/> -->
		<!-- 定义视图解析器:为了减少在控制器当中转发视图的代码 -->
		<bean id="viewResolver" class=
    "org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 设置前缀 -->
		<property name="prefix" value="/WEB-INF/jsp/" />
		<!-- 设置后缀 -->
		<property name="suffix" value=".jsp" />
		</bean>
		<!-- 拦截器 -->
		<mvc:interceptors>
			<mvc:interceptor>
			<!-- 只拦截/userInterceptor/*路径下的请求 -->
				<mvc:mapping path="/*.do"/>
				<!-- 自定义拦截器类 -->
				<bean class="com.interceptor.LoginInterceptor"></bean>
			</mvc:interceptor>
		</mvc:interceptors>        
</beans>

4、编写配置文件web.xml

web代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
	<display-name>chap3</display-name>
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  	</listener>
	<!-- 全局配置变量,配置IoC配置文件的位置信息 -->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value></param-value>
  	</context-param>
<!-- app:Servlet -->
<!-- DispatcherServlet:提供app实现类,MVC的核心控制器 -->
<!-- contextConfigLocation:MVC自己的配置文件的位置信息 -->
<!-- <load-on-startup>1</load-on-startup>:加载的优先级 -->
    <servlet>
    <servlet-name>app</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  	</servlet>
<!-- <url-pattern>*.do</url-pattern>:定义了前面定义为app的Servlet对访问资源的控制范围和控制方式 -->
<!-- *.do:拦截所有以*.do结尾的请求 -->
    <servlet-mapping>
    <servlet-name>app</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</web-app>

5、视图页面,main.jsp作为主页,login.jsp是登录页面,在没有登录前,只能显示login.jsp页面,其他页面是不允许访问的,只有登录后,才能访问其他页面,如main.jsp

(1)main.jsp页面

main代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>主页</title>
</head>
<body>
当前用户:${user.username}
<a href="${pageContext.request.contextPath}/userInterceptor/logout.do">退出</a>
</body>
</html>

(2)login.jsp页面

login代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录页面</title>
</head>
<body>
${msg}
<form action="${pageContext.request.contextPath }/userInterceptor/login.do" 
			                       method="post" onsubmit="return check()">
          <br /><br />&nbsp;号:<input id="username" type="text" name="username" />
          <br /><br />&nbsp;码:<input id="password" type="password" name="password" />
          <br /><br />
          <center><input type="submit" value="登录" /></center>
		 </form>
</body>
</html>

三、实验结果

1、登录界面

在这里插入图片描述

2、输入正确的用户名和密码

在这里插入图片描述

3、输入错误的用户名和密码

在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍Spring中的拦截器-实现用户登录权限的控制,感兴趣的小伙伴可以自己动手试试看。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值