仿牛客社区——2.4.1检查用户登录状态

项目为已登录用户提供头像上传和密码修改功能,这两个功能位于同一页面。未登录用户无法访问。使用自定义注解`@LoginRequired`标记需要验证的方法,并通过拦截器检查用户登录状态,未登录用户会被重定向到登录页面。头像上传和密码修改都在登录验证下进行,以防止非法篡改。
摘要由CSDN通过智能技术生成

实现功能

对目前来说,该项目实现了用户头像上传和修改密码功能(两个功能写在同一页面),而这个页面只显示给已登录的用户,如果外界用户尚未登录的情况下,是无法访问到这个这个页面的,当处于未登录状态想访问修改头像功能(主要是防止头像被篡改,至于修改密码,个人理解因为当进行修改密码操作时,会获取当前用户,如果获取不到当前用户则密码不会被修改,因此只需要拦截修改头像功能)时,会强制跳转至登录界面

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");
//不拦截静态资源

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值