最近做SSM项目,遇到需要使用拦截器的需求,例如用户在未登录时无法进行买票并支付,下面就本人的经验手把手的教大家如何搭建拦截器。
下面我将模拟用户只有登录后才能进入主页的业务场景来进行代码实现。
1.创建Maven空项目并导入依赖
打开IDEA,选择文件,点击新建项目,选择创建Maven原型项目,至于名称,位置以及工作坐标可以执行选择。
创建项目完成后,需要导入pom.xml依赖,具体如下所示。
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
</dependencies>
2.编写前端界面和导入静态资源
编写界面前,选中该项目右击添加框架支持,选择添加web应用程序,这样就可以保证最新版本4.0。
在web目录下创建登录注册页面loginAndRegister.jsp
具体代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录注册</title>
<script type="text/javascript" src="js/jquery-3.6.0.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/loginAndRegister.css">
<script>
<%-- 注册登录切换--%>
window.onload = function (){
var item = document.getElementsByClassName("item");
var it = item[0].getElementsByTagName("div");
var content = document.getElementsByClassName("content");
var con = content[0].getElementsByTagName("div");
for(let i=0;i<it.length;i++){
it[i].onclick = function (){
for(let j=0;j<it.length;j++){
it[j].className = '';
con[j].style.display = "none";
}
this.className = "active";
it[i].index = i;
con[i].style.display = "block";
}
}
}
</script>
</head>
<body>
<div class="control">
<div class="item">
<div class="active">登录</div><div>注册</div>
</div>
<div class="content">
<div style="display: block">
<form action="${pageContext.request.contextPath}/user/login">
<p style="color: red">${error}</p>
<p>用户名</p>
<input type="text" id="username" name="user_name" placeholder="请输入用户名或手机号"/>
<p>密码</p>
<input type="password" id="pwd" name="user_pwd" placeholder="请输入密码"/>
<span id="msg"></span>
<br>
<input type="submit" id="login" value="登录">
</form>
</div>
<div>
<form action="${pageContext.request.contextPath}/user/register">
<p>用户名</p>
<input type="text" name="user_name" placeholder="请输入用户名"/>
<p>邮箱</p>
<input type="text" name="user_email" placeholder="请输入邮箱"/>
<p>密码</p>
<input type="password" name="user_pwd" placeholder="请输入密码"/>
<p>确认密码</p>
<input type="password" placeholder="请再次输入密码"/>
<br>
<input type="submit" id="register" value="注册">
</form>
</div>
</div>
</div>
</body>
</html>
为了适应SpringMVC的视图解析器,所以在WEB-INF目录下创建jsp目录,在jsp目录下创建home.jsp首页页面。
具体如下,主页代码很简单,读者可自行更改。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
欢迎来到首页
</body>
</html>
不仅如此,由于需要引入jquery和登录页面的css样式。jquery读者可执行去官网下载或者下载在线路径,登录的css样式代码如下所示:
*{
margin:0;
padding: 0;
}
body{
background-color: #f3f3f3;
/*background-image: url("../static/images/");*/
background-repeat: no-repeat;
}
.control{
width: 340px;
background: white;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
border-radius: 5px;
/*opacity: 80%;*/
}
.item{
width: 340px;
height: 60px;
background: #eeeeee;
display:flex;
}
.item div{
width: 170px;
height: 60px;
display: inline-block;
color: black;
font-size: 18px;
text-align: center;
line-height: 60px;
cursor: pointer;
}
.content{
width: 100%;
}
.content div{
margin: 20px 30px;
display: none;
text-align: left;
}
p{
color: #4a4a4a;
margin-top: 30px;
margin-bottom: 6px;
font-size: 15px;
}
.content input[type="text"], .content input[type="password"]{
width: 100%;
height: 40px;
border-radius: 3px;
border:1px solid #adadad;
padding: 0 10px;
box-sizing: border-box;
}
.content input[type="submit"]{
margin-top: 40px;
width: 100%;
height: 40px;
border-radius: 5px;
color: white;
border: 1px solid #adadad;
background: #00dd60;
cursor: pointer;
letter-spacing: 4px;
margin-bottom: 40px;
}
.content input[type="button"]{
cursor: pointer;
font-weight: bold;
text-align: center;
color: red;
margin-left: 20px;
width: 88px;
height: 30px;
border: none;
background-color: rgba(255, 255, 255, 0.8);
border-radius: 5px;
}
.active{
background: white;
}
.item div:hover{
background: #f6f6f6;
}
3.编写web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http:///xml/ns/javaee"
xmlns:xsi="http:///2001/XMLSchema-instance"
xsi:schemaLocation="http:///xml/ns/javaee http:///xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>loginAndRegister.jsp</welcome-file>
</welcome-file-list>
<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:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 所有的请求都会被springmvc拦截-->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
</web-app>
在里面主要配置了DispatcherServlet,中文乱码过滤以及Spring拦截器等等。
4.编写spring-mvc.xml文件
<?xml version="1.0" encoding="UTF8"?>
<beans xmlns="http:///schema/beans"
xmlns:xsi="http:///2001/XMLSchema-instance"
xmlns:mvc="http:///schema/mvc"
xmlns:context="http:///schema/context"
xsi:schemaLocation="http:///schema/beans
http:///schema/beans/spring-beans.xsd
http:///schema/mvc
https:///schema/mvc/spring-mvc.xsd
http:///schema/context
https:///schema/context/spring-context.xsd">
<!-- 1.注解驱动-->
<mvc:annotation-driven/>
<!-- 2.静态资源过滤-->
<mvc:default-servlet-handler/>
<!-- 3.扫描包-->
<context:component-scan base-package="com.xing.controller"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/home"/>
<bean class="com.xing.filter.userFilter"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 4.视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
输入以上代码后,读者可自行配置应用程序上下文。
拦截器配置文件主要是这一部分,即服务器会拦截/user/home请求,com.xing.filter.userfilter是拦截器对应的处理类。
5.编写拦截器处理类
创建一个userFilter拦截器处理类,实现HandlerInterceptor接口并重写preHandle方法即可。
package com.xing.filter;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class userFilter implements HandlerInterceptor {
//返回前拦截
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(request.getSession().getAttribute("user")!=null){
return true;
}
//重定向到登录注册页面
request.getRequestDispatcher("/loginAndRegister.jsp").forward(request,response);
return false;
}
}
该代码表示,如果用户登录后,将可以在session中获取到user,返回true,这样服务器就不会拦截,否则就是返回false,重定向到登录界面。
6.编写用户控制类(userController)
package com.xing.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/home")
public String enterHome(){
return "home";
}
@RequestMapping("/login")
public String login(HttpServletRequest request){
//判断账号密码是否匹配
request.getSession().setAttribute("user","v587");
return "home";
}
}
/user/login请求是走登录请求,服务器会给session设置一个值,方便拦截器判断其值是否为空;
/user/home是直接进入首页的请求。
7.结果展示
由于在web.xml中配置了欢迎页,所以项目执行成功就会直接定位到登录注册页面。如果未登录直接请求http://localhost:8080/user/home,将会重定向到登录注册页面。
如果输入用户名和密码并点击登录,将会跳转到home.jsp首页页面,结果如下:
8.错误纠正
如果读者遇到以下问题,不要犹豫,这一定就是构建SpringMVC常见错误。
即用Maven下载的外部库,并未导入项目结构中。如图所示。
解决方法就是:在WEB-INF目录下创建一个lib目录,将所有的库文件导入lib目录即可解决问题,具体如图所示:
如此就可以解决所遇到的问题!