インターネット技術の成熟に伴い、情報管理の効率化と自動化が教育分野でも求められています。従来の学生の学習記録や授業スケジュールの管理は手作業が多く、ミスが発生しやすく、セキュリティも脆弱でした。本システムは、JavaとSSM(Spring + Spring MVC + MyBatis)を基盤に構築されたオンライン学習プラットフォームで、教員・学生・管理者それぞれの役割に応じた機能を提供し、教育情報の一元管理と業務効率化を実現します。
技術スタック
- 開発言語:Java
- フレームワーク:SSM
- フロントエンド:JSP
- データベース:MySQL 5.7+
- サーバー:Tomcat 7〜10
- ビルドツール:Maven
- IDE:Eclipse / IntelliJ IDEA
主要機能概要
管理者モジュール
- 教員・学生アカウント管理:登録、編集、削除、検索が可能
- ニュース管理:学内お知らせの公開・更新・削除。公開記事はフロントページに表示
- 掲示板監視:学生からの質問や意見を閲覧し、公式返信を投稿
教員モジュール
- 動画教材管理:授業用動画のアップロード・更新・削除
- 授業スケジュール管理:開講・終了時刻の設定と照会
- 課題回収:学生提出ファイルのダウンロードと進捗確認
学生モジュール
- 動画視聴学習:教材動画を視聴し、学習感想を投稿
- お気に入り登録:興味のある講義をブックマーク
- 質問掲示板:不明点を投稿し、管理者または教員からの回答を確認
コード例:認証インターセプター
package edu.security;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import com.auth.TokenValidator;
import com.model.AuthToken;
@Component
public class AuthInterceptor implements HandlerInterceptor {
private static final String AUTH_HEADER = "Auth-Token";
@Autowired
private TokenValidator tokenValidator;
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) {
// CORS対応
res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE");
res.setHeader("Access-Control-Allow-Headers", "Auth-Token,Content-Type");
if (!(handler instanceof HandlerMethod)) return true;
HandlerMethod method = (HandlerMethod) handler;
if (method.getMethodAnnotation(BypassAuth.class) != null) return true;
String tokenStr = req.getHeader(AUTH_HEADER);
AuthToken token = tokenValidator.validate(tokenStr);
if (token != null) {
req.getSession().setAttribute("user_id", token.getUserId());
req.getSession().setAttribute("user_role", token.getRole());
return true;
}
res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
res.getWriter().write("{\"error\":\"認証が必要です\"}");
return false;
}
}
コード例:ユーザ認証コントローラ
package edu.controller;
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired
private UserService userService;
@PostMapping("/signin")
public ResponseEntity<Map<String, Object>> signIn(
@RequestParam String account,
@RequestParam String secret
) {
User user = userService.findByAccount(account);
if (user == null || !user.getSecret().equals(secret)) {
return ResponseEntity.status(401).body(Map.of("error", "認証失敗"));
}
String sessionToken = TokenGenerator.create(user.getId(), user.getRole());
return ResponseEntity.ok(Map.of("token", sessionToken));
}
@PostMapping("/signup")
public ResponseEntity<String> signUp(@RequestBody User newUser) {
if (userService.existsByAccount(newUser.getAccount())) {
return ResponseEntity.badRequest().body("アカウント重複");
}
userService.register(newUser);
return ResponseEntity.ok("登録完了");
}
@GetMapping("/signout")
public ResponseEntity<String> signOut(HttpServletRequest request) {
request.getSession().invalidate();
return ResponseEntity.ok("ログアウト成功");
}
}