以下是一个Java登录后保存到session,调用带有指定注解的接口时检查是否登录的示例:
1. 定义一个注解`@LoginRequired`,用于标记需要登录才能访问的接口。
```java
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {
}
```
2. 在登录成功后将用户信息保存到session中。
```java
@RequestMapping("/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session) {
// 验证用户名和密码
if (isValid(username, password)) {
// 登录成功,将用户信息保存到session中
User user = new User(username);
session.setAttribute("user", user);
return "redirect:/home";
} else {
// 登录失败,返回错误页面
return "error";
}
}
```
3. 编写一个拦截器`LoginInterceptor`,用于拦截所有带有`@LoginRequired`注解的请求,并检查用户是否已经登录。
```java
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;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
LoginRequired loginRequired = handlerMethod.getMethodAnnotation(LoginRequired.class);
if (loginRequired != null) {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
// 用户未登录,跳转到登录页面
response.sendRedirect("/login");
return false;
}
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request,