实现功能
对目前来说,该项目实现了用户头像上传和修改密码功能(两个功能写在同一页面),而这个页面只显示给已登录的用户,如果外界用户尚未登录的情况下,是无法访问到这个这个页面的,当处于未登录状态想访问修改头像功能(主要是防止头像被篡改,至于修改密码,个人理解因为当进行修改密码操作时,会获取当前用户,如果获取不到当前用户则密码不会被修改,因此只需要拦截修改头像功能)时,会强制跳转至登录界面
Annotation
@Target(ElementType.METHOD)//此自定义注解在方法上生效
@Retention(RetentionPolicy.RUNTIME)//此自定义注解在运行时生效
public @interface LoginRequired {
}
ControllerMethod
需要在要访问修改页面的请求方法上声明自定义的注解
//跳转到账号设置页面
@LoginRequired //需要拦截请求:安全
@RequestMapping(value = "/setting",method = RequestMethod.GET)
public String getSettings(){
return "/site/setting";
}
//将头像上传的头像保存到本地
@LoginRequired //需要拦截请求:安全
@RequestMapping(value = "/upload",method = RequestMethod.POST)
public String uploadHeader(MultipartFile headerImage, Model model){
//判断获取的头像是否存在
if(headerImage==null){
model.addAttribute("error","头像不能为空!");
return "/site/setting";
}
//头像存在
//为头像保存一个随机名,以免重复
String fileName = headerImage.getOriginalFilename(); //获取头像名
String suffix = fileName.substring(fileName.lastIndexOf("."));//获取后缀:.xxx
//判断头像格式是否正确
if(StringUtils.isBlank(suffix)){
model.addAttribute("error","头像格式不正确!");
return "/site/setting";
}
Interceptor
@Component
public class LoginRequiredInterceptor implements HandlerInterceptor {
@Autowired
private HostHolder hostHolder;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(handler instanceof HandlerMethod){ //判断要拦截的是否是方法
HandlerMethod handlerMethod=(HandlerMethod) handler;
Method method = handlerMethod.getMethod();//获取拦截到的方法对象
LoginRequired loginRequired = method.getAnnotation(LoginRequired.class);//获取该方法对象上的自定义注解
if(loginRequired!=null&&hostHolder.getUser()==null){ //错误情况:需要被拦截
response.sendRedirect(request.getContextPath()+"/login"); //强制重定向到登录页面
}
}
return true;
}
}
Config
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
//将拦截器注入
@Autowired
private LoginRequiredInterceptor loginRequiredInterceptor;
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(loginRequiredInterceptor)
.excludePathPatterns("/**/*.css","/**/*.js","/**/*.jpg","/**/*.jpeg","/**/*.png");
//不拦截静态资源
}
}