前后端分离项目通过注解+拦截器鉴权

该博客介绍了如何使用自定义注解`Authorized`和拦截器`AuthInterceptor`进行权限验证。在处理HTTP请求之前,拦截器检查方法或类是否带有`Authorized`注解,并根据session中的`CURRENT_USER`判断用户是否已授权。如果未授权,返回错误响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 注解类(Authorized.java)
@Documented
@Inherited
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Authorized {
}
  • 拦截器处理类(AuthInterceptor.java)
public class AuthInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Authorized authorized = handlerMethod.getMethodAnnotation(Authorized.class);
        if (authorized == null) {
            authorized = handlerMethod.getMethod().getDeclaringClass().getAnnotation(Authorized.class);
        }

        if (authorized != null) {
            return isAuthorized(request, response);
        }
        return true;
    }

    private boolean isAuthorized(HttpServletRequest request, HttpServletResponse response) {
    	//CURRENT_USER已经在登录完成的时候存到session中了
        JSONObject userJSON = (JSONObject) request.getSession().getAttribute("CURRENT_USER");

        if (userJSON != null) {
            return true;
        }

        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8;");

        try (PrintWriter writer = response.getWriter()) {
            String buffer = JSONObject.toJSONString(
                    BeeResponseEntity.failed(ErrorCode.UNAUTHORIZED),
                    SerializerFeature.WriteMapNullValue,
                    SerializerFeature.WriteDateUseDateFormat
            );
            writer.print(buffer);
            return false;
        } catch (IOException e) {
            return false;
        }
    }
}
<think>好的,我现在需要帮助用户了解SpringBoot与Vue构建前后端分离项目的结构示例和最佳实践。首先,我得回忆一下前后端分离的基本概念。前后端分离意味着前端和后端各自独立开发,通过API进行通信。前端通常用Vue这样的框架,后端用SpringBoot提供RESTful API。 接下来,用户想要项目结构的示例和最佳实践。我需要整理出典型的目录结构。对于SpringBoot后端,常见的结构包括controller、service、mapper、entity等包。而Vue前端可能有src目录下包含components、router、store、api等文件夹。 然后,我需要参考用户提供的引用内容。引用[1]提到vue+springboot+mybatisplus+mysql的项目架构,可以直接扩展代码。引用[2]中的DemoApplication.java展示了SpringBoot的启动类,带有@MapperScan注解,说明使用了MyBatis Plus。引用[4]中的PersonController示例,展示了如何创建RESTful接口,使用@RestController和@RequestMapping。 需要注意前后端如何协作。引用[3]提到前端打包生成dist,后端可能需要配置静态资源处理或者使用Nginx代理。这在项目部署时很重要。 最佳实践方面,应该包括模块化开发、接口规范(如RESTful)、安全措施(JWT)、跨域处理、以及自动化构建部署。比如后端使用Spring Security进行,前端通过axios调用API,使用Vue Router管理路由。 用户可能还关心如何组织代码,比如后端的分层结构(Controller层处理请求,Service层业务逻辑,Mapper层数据库操作),前端的状态管理(Vuex)和API请求封装。此外,前后端分离项目的配置,如跨域问题的解决,可以通过后端配置CORS或Nginx反向代理。 还要考虑版本控制和项目管理,比如使用Git管理代码,前后端作为不同的仓库或子模块。测试方面,后端可以使用JUnit,前端用Jest或Cypress进行单元和E2E测试。 可能用户没有明确提到但需要注意的点包括环境配置(开发、测试、生产)、日志管理、异常处理、API文档(Swagger)等。这些都能提升项目的可维护性和协作效率。 最后,需要生成相关问题,可能涉及具体技术实现、常见问题解决、性能优化等,比如如何解决跨域问题,如何实现,如何优化前端打包体积等。确保问题覆盖用户可能遇到的后续疑问。</think>### SpringBoot与Vue前后端分离项目结构示例与最佳实践 #### 1. **项目整体结构** 前后端分离项目通常分为两个独立模块: - **后端(SpringBoot)**:提供RESTful API接口,处理业务逻辑和数据库交互 - **前端(Vue)**:负责UI展示和用户交互,通过axios等工具调用后端接口 #### 2. **后端(SpringBoot)项目结构** ```bash src/main/java ├── com.example.demo │ ├── config # 配置类(跨域配置、安全配置等) │ ├── controller # 控制器层(API接口定义)[^4] │ ├── service # 服务层(业务逻辑实现) │ ├── mapper # 数据访问层(MyBatis Plus接口)[^2] │ ├── entity # 实体类(数据库表映射) │ └── DemoApplication.java # 启动类 resources/ ├── application.yml # 配置文件 └── static/ # 可放置前端打包后的dist文件[^3] ``` #### 3. **前端(Vue)项目结构** ```bash src/ ├── api/ # 后端接口封装 ├── assets/ # 静态资源 ├── components/ # 公共组件 ├── router/ # 路由配置 ├── store/ # Vuex状态管理 ├── views/ # 页面组件 └── main.js # 入口文件 ``` #### 4. **关键实践要点** 1. **接口规范**: - 使用RESTful风格设计API,例如: ```java @GetMapping("/users/{id}") public User getUser(@PathVariable Long id) { ... }[^4] ``` 2. **跨域处理**: ```java // SpringBoot配置类示例 @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:8080") // Vue开发服务器地址 .allowedMethods("*"); } } ``` 3. **安全控制**: - 推荐集成Spring Security实现JWT - 前端在axios拦截器中添加token: ```javascript axios.interceptors.request.use(config => { config.headers.Authorization = localStorage.getItem('token') return config }) ``` 4. **构建部署**: - 前端执行`npm run build`生成dist目录 - 后端可通过Nginx代理或直接托管静态资源: ```nginx server { listen 80; location / { root /usr/share/nginx/html/dist; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend-server:8080; } } ``` #### 5. **典型接口调用示例** 前端Vue组件调用接口: ```javascript // api/user.js export function getUsers() { return axios.get('/api/users') } // Vue组件 import { getUsers } from '@/api/user' export default { methods: { async loadData() { const res = await getUsers() this.users = res.data } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值