从零开始学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 />
账 号:<input id="username" type="text" name="username" />
<br /><br />
密 码:<input id="password" type="password" name="password" />
<br /><br />
<center><input type="submit" value="登录" /></center>
</form>
</body>
</html>
三、实验结果
1、登录界面
2、输入正确的用户名和密码
3、输入错误的用户名和密码
总结
以上就是今天要讲的内容,本文仅仅简单介绍Spring中的拦截器-实现用户登录权限的控制,感兴趣的小伙伴可以自己动手试试看。