目录
4.1 Authorizatelnterceptor.java
三、com.test.domain 实体层
3.1 ClientMessage.java
3.2 Permission.java
3.3 Role.java
3.4 TBusiness.java
3.5 TOrder.java
3.6 TOrderDetail.java
3.7 TProduct.java
3.8 TShoppingcartdetail.java
3.9 TStock.java
3.10 TThreshold.java
3.11 TUserRole.java
3.12 TXinDai.java
3.13 User.java
四、com.test.interceptor 拦截器层
4.1 Authorizatelnterceptor.java
package com.test.interceptor;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.test.annotation.RequirePermission;
import com.test.domain.Permission;
import com.test.domain.User;
// 权限验证拦截器
public class AuthorizateInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1.获取访问接口对应的权限
HandlerMethod method = (HandlerMethod) handler;
RequirePermission requirePermission = method.getMethod().getAnnotation(RequirePermission.class);
if (requirePermission == null) {
return true; // 如果没有标记 RequirePermission 注解,不进行权限验证,直接通过
}
// 2.获取用户所有权限(目录+菜单+按钮)
HttpSession session = request.getSession();
User user = (User) session.getAttribute("loginUser");
List<Permission> permissionList = user.getPermissionList();
// 3.当前请求方法需要的权限
String privilege = requirePermission.value();
// 判断权限
for (Permission permission : permissionList) {
if (permission.getType() != 1) {
if (privilege.indexOf(permission.getCode()) > -1) {
return true; // 如果用户拥有该权限,允许访问
}
}
}
// 如果用户没有权限,重定向到403页面或其他指定的页面
response.sendRedirect("/403.jsp");
return false;
}
@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 {
// 处理完请求后的处理,通常用于日志记录或修改响应
}
}
这段代码实现了一个权限验证拦截器,主要作用如下:
1. **权限控制**:拦截器用于对用户访问的请求进行权限控制。在应用中,不是所有用户都具有相同的权限,有些请求可能仅限于特定角色或权限的用户访问。这拦截器的主要作用是检查用户是否具有访问特定请求方法所需的权限。
2. **注解支持**:通过使用注解 `@RequirePermission`,可以为控制器方法指定需要的权限。这使得开发者可以在代码中明确指定每个方法的权限要求,而不是将权限验证逻辑硬编码到每个方法中。
3. **用户权限验证**:拦截器在 `preHandle` 方法中获取当前用户的权限列表,通常是从用户登录会话中获取的。然后,它检查用户是否具有访问当前请求方法所需的权限,这是通过比较方法需要的权限与用户实际拥有的权限来实现的。
4. **重定向到403页面**:如果用户没有所需的权限,拦截器会将请求重定向到403页面,通常是权限不足或拒绝访问的页面。这有助于提供友好的错误信息和用户体验。
总之,这段代码的作用是在用户请求到达控制器方法之前,验证用户是否具有足够的权限来执行该请求,以确保应用的安全性和数据保护。如果用户没有所需的权限,将用户重定向到适当的错误页面或执行其他相应的拒绝访问操作。这有助于实现访问控制和权限管理。
4.2 LoginInterceptor.java
package com.test.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.ModelAndView;
// 登录拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 获取用户会话
HttpSession session = request.getSession();
// 检查会话中是否已经存在登录用户信息
Object userObj = session.getAttribute("loginUser");
if (userObj != null) {
// 用户已登录,允许继续请求
return true;
}
// 用户未登录,重定向到登录页面
response.sendRedirect("index.jsp"); // 重定向到登录页面,可以根据实际情况修改跳转路径
// 也可以使用以下方式转发到登录页面(注释掉的部分)
// request.getRequestDispatcher("login.jsp").forward(request, response);
// 返回 false 表示请求终止,不会继续执行后续的处理器或控制器
return false;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 请求完成后的处理,通常用于资源清理等
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
// 处理完请求后的处理,通常用于日志记录或修改响应
}
}
这段代码实现了一个登录拦截器(Login Interceptor),其主要作用是控制用户访问受限资源或页面的权限,确保只有已登录的用户能够访问受保护的页面。以下是这段代码的作用:
1. **用户登录验证**:拦截器在用户请求到达控制器方法之前执行,它首先检查用户会话(`HttpSession`)中是否已存在登录用户信息。如果会话中存在登录用户信息(`loginUser`),则表示用户已经登录,允许继续请求执行。
2. **未登录用户处理**:如果用户未登录(即会话中不存在登录用户信息),拦截器将执行以下操作:
- 重定向(`response.sendRedirect("index.jsp")`):将用户重定向到登录页面。这通常是登录页面的路径,但您可以根据实际情况自定义路径。
- 或者使用请求转发(`request.getRequestDispatcher("login.jsp").forward(request, response)`):将用户请求转发到登录页面。3. **请求终止**:返回 `false` 表示请求终止,不会继续执行后续的处理器或控制器。这意味着用户必须登录后才能访问受保护的资源,否则请求将被拦截。
总之,这段代码的作用是确保用户必须经过身份验证并登录后才能访问某些页面或资源。如果用户未登录,他们将被重定向到登录页面以完成登录操作。这有助于维护应用程序的安全性和用户访问控制。